diff --git a/nixos/doc/manual/release-notes/rl-2611.section.md b/nixos/doc/manual/release-notes/rl-2611.section.md index 01a6fca7eee8..293f3bee0829 100644 --- a/nixos/doc/manual/release-notes/rl-2611.section.md +++ b/nixos/doc/manual/release-notes/rl-2611.section.md @@ -120,6 +120,8 @@ - [rosec](https://github.com/jmylchreest/rosec), a secrets daemon implementing the freedesktop.org Secret Service API with modular backend providers. It can automatically unlock the user's vault on login via PAM. Available as [services.rosec](#opt-services.rosec.enable). +- [Hydra builder](https://github.com/NixOS/hydra), the build agent for Hydra's queue runner. Available as [services.hydra-builder](#opt-services.hydra-builder.enable). + - [NordVPN](https://github.com/NordSecurity/nordvpn-linux), a NordVPN client for linux. Available as [services.nordvpn](options.html#opt-services.nordvpn.enable). - [RNSD](https://reticulum.network/), the Reticulum Network Stack Daemon. It provides a secure and efficient way to communicate over the Reticulum Network. Available as [services.rnsd](#opt-services.rnsd.enable). @@ -314,6 +316,15 @@ make the required changes to your configuration and database, if needed, before you upgrade to NixOS 26.11. +- `hydra` has been updated to the Rust queue runner/evaluator: + - `services.hydra.dbi` was replaced by [services.hydra.dbUrl](#opt-services.hydra.dbUrl), which takes a `postgres://` URL instead of a DBI string. + - `services.hydra.buildMachinesFiles` was removed. The queue runner no longer connects to build machines over SSH. Instead each build machine (including the Hydra host itself, if it should build) must enable [services.hydra-builder](#opt-services.hydra-builder.enable) and point it at [services.hydra.queueRunner.grpc](#opt-services.hydra.queueRunner.grpc.port). + - The queue runner, evaluator and the new `hydra-ws` log streaming service are configured via `services.hydra.queueRunner.settings`, [services.hydra.evaluatorSettings](#opt-services.hydra.evaluatorSettings) and `services.hydra.ws.settings` respectively, instead of `hydra.conf`. + +- NetBox was updated to `>= 4.6.8`. Have a look at the breaking changes + of the [4.6 release](https://github.com/netbox-community/netbox/releases/tag/v4.6.0), + make the required changes to your database, if needed, then upgrade by setting `services.netbox.package = pkgs.netbox_4_6;` in your configuration. + - The COSMIC desktop module now enables by default `system76-power` and `system76-scheduler` following upstream recommended packages. The previous power managment service can be enabled back by setting `services.power-profiles-daemon.enable = true`. - The `programs.dms-shell.enableVPN`, `enableDynamicTheming`, `enableAudioWavelength`, and `enableCalendarEvents` options have been removed. `matugen` and `cava` are now included in the default DMS environment and can be excluded with `programs.dms-shell.excludePackages`. Networking and calendar backends are configured separately. diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 4ddc2a59fa5f..d27fba2a10ba 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -535,6 +535,7 @@ ./services/continuous-integration/gocd-agent/default.nix ./services/continuous-integration/gocd-server/default.nix ./services/continuous-integration/hercules-ci-agent/default.nix + ./services/continuous-integration/hydra/builder.nix ./services/continuous-integration/hydra/default.nix ./services/continuous-integration/jenkins/default.nix ./services/continuous-integration/jenkins/job-builder.nix diff --git a/nixos/modules/services/continuous-integration/hydra/builder.nix b/nixos/modules/services/continuous-integration/hydra/builder.nix new file mode 100644 index 000000000000..43720b5400cc --- /dev/null +++ b/nixos/modules/services/continuous-integration/hydra/builder.nix @@ -0,0 +1,305 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.services.hydra-builder; + + user = "hydra-builder"; + + format = pkgs.formats.toml { }; +in +{ + options.services.hydra-builder = { + enable = lib.mkEnableOption "the Hydra build agent, which connects to the queue runner over gRPC and executes builds"; + + package = lib.mkPackageOption pkgs "hydra-builder" { }; + + queueRunnerAddr = lib.mkOption { + type = lib.types.singleLineStr; + example = "http://hydra.example.org:50051"; + description = '' + Address of the queue runner's gRPC endpoint, see + {option}`services.hydra.queueRunner.grpc`. + ''; + }; + + settings = lib.mkOption { + description = '' + Builder settings, written to {file}`/etc/hydra/builder.toml`. + ''; + default = { }; + type = lib.types.submodule { + options = { + pingInterval = lib.mkOption { + type = lib.types.ints.positive; + default = 10; + description = "Interval in seconds at which pings are sent to the queue runner."; + }; + + speedFactor = lib.mkOption { + type = lib.types.oneOf [ + lib.types.ints.positive + lib.types.float + ]; + default = 1; + description = "Speed factor of this machine, relative to the other builders."; + }; + + maxJobs = lib.mkOption { + type = lib.types.ints.positive; + default = 4; + description = '' + Maximum number of concurrent jobs. Only honoured when the queue + runner's {option}`services.hydra.queueRunner.settings.machineFreeFn` + takes job limits into account. + ''; + }; + + buildCores = lib.mkOption { + type = lib.types.ints.unsigned; + default = config.nix.settings.cores; + defaultText = lib.literalExpression "config.nix.settings.cores"; + description = '' + Cores made available to each build (`NIX_BUILD_CORES`). 0 means + all available cores. + ''; + }; + + buildDirAvailThreshold = lib.mkOption { + type = lib.types.float; + default = 10.0; + description = '' + Percentage of free space on the Nix build directory below which + jobs stop being scheduled on this machine. + ''; + }; + + storeAvailThreshold = lib.mkOption { + type = lib.types.float; + default = 10.0; + description = '' + Percentage of free space on {file}`/nix/store` below which jobs + stop being scheduled on this machine. + ''; + }; + + load1Threshold = lib.mkOption { + type = lib.types.float; + default = 8.0; + description = '' + Load1 above which jobs stop being scheduled on this machine. Only + used when PSI is unavailable. + ''; + }; + + cpuPsiThreshold = lib.mkOption { + type = lib.types.float; + default = 75.0; + description = "CPU PSI over the last 10s above which jobs stop being scheduled on this machine."; + }; + + memPsiThreshold = lib.mkOption { + type = lib.types.float; + default = 80.0; + description = "Memory PSI over the last 10s above which jobs stop being scheduled on this machine."; + }; + + ioPsiThreshold = lib.mkOption { + type = lib.types.nullOr lib.types.float; + default = null; + description = '' + IO PSI over the last 10s above which jobs stop being scheduled on + this machine. `null` disables this check. + ''; + }; + + systems = lib.mkOption { + type = lib.types.nullOr (lib.types.listOf lib.types.singleLineStr); + default = null; + example = [ "x86_64-linux" ]; + description = '' + Systems this builder can build for. `null` reads `system` and + `extra-platforms` from Nix; an empty list advertises none. + ''; + }; + + supportedFeatures = lib.mkOption { + type = lib.types.nullOr (lib.types.listOf lib.types.singleLineStr); + default = null; + example = [ "big-parallel" ]; + description = '' + Features this builder supports. `null` reads `system-features` + from Nix; an empty list advertises none. + ''; + }; + + mandatoryFeatures = lib.mkOption { + type = lib.types.listOf lib.types.singleLineStr; + default = [ ]; + example = [ "FOD" ]; + description = "Features a step must request to be scheduled on this builder."; + }; + + useSubstitutes = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Whether the builder substitutes paths instead of fetching them from the queue runner."; + }; + }; + }; + }; + + authorizationFile = lib.mkOption { + type = lib.types.nullOr lib.types.path; + default = null; + description = '' + Path to a file holding the authorization token, as an alternative to + {option}`mtls`. The token has to be listed in the queue runner's + {option}`services.hydra.queueRunner.settings.tokenPaths`. + ''; + }; + + mtls = lib.mkOption { + default = null; + description = "mTLS material used to authenticate against the queue runner."; + type = lib.types.nullOr ( + lib.types.submodule { + options = { + serverRootCaCertPath = lib.mkOption { + type = lib.types.path; + description = "Server root CA certificate path."; + }; + + clientCertPath = lib.mkOption { + type = lib.types.path; + description = "Client certificate path."; + }; + + clientKeyPath = lib.mkOption { + type = lib.types.path; + description = "Client key path."; + }; + + domainName = lib.mkOption { + type = lib.types.singleLineStr; + description = "Domain name the server certificate is validated against."; + }; + }; + } + ); + }; + }; + + config = lib.mkIf cfg.enable { + systemd.services.hydra-builder = { + description = "Hydra build agent"; + requires = [ "nix-daemon.socket" ]; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + restartTriggers = [ config.environment.etc."hydra/builder.toml".source ]; + + environment = { + NIX_REMOTE = "daemon"; + RUST_BACKTRACE = "1"; + # nix-store wants $HOME for its cache dir. + HOME = "/run/hydra-builder"; + }; + + path = [ config.nix.package ]; + + serviceConfig = { + Type = "notify"; + Restart = "always"; + RestartSec = "5s"; + + ExecStart = lib.escapeShellArgs ( + [ + (lib.getExe cfg.package) + "--gateway-endpoint" + cfg.queueRunnerAddr + "--config-path" + "/etc/hydra/builder.toml" + ] + ++ lib.optionals (cfg.authorizationFile != null) [ + "--authorization-file" + cfg.authorizationFile + ] + ++ lib.optionals (cfg.mtls != null) [ + "--server-root-ca-cert-path" + cfg.mtls.serverRootCaCertPath + "--client-cert-path" + cfg.mtls.clientCertPath + "--client-key-path" + cfg.mtls.clientKeyPath + "--domain-name" + cfg.mtls.domainName + ] + ); + + User = user; + Group = "hydra"; + + RuntimeDirectory = "hydra-builder"; + + ReadWritePaths = [ + "/nix/var/nix/gcroots/" + "/nix/var/nix/daemon-socket/socket" + ]; + ReadOnlyPaths = [ "/nix/" ]; + + CapabilityBoundingSet = ""; + LockPersonality = true; + MemoryDenyWriteExecute = true; + NoNewPrivileges = true; + PrivateDevices = true; + PrivateMounts = true; + PrivateTmp = true; + PrivateUsers = true; + ProtectClock = true; + ProtectControlGroups = true; + ProtectHome = true; + ProtectHostname = true; + ProtectKernelLogs = true; + ProtectKernelModules = true; + ProtectKernelTunables = true; + ProtectSystem = "strict"; + RemoveIPC = true; + RestrictNamespaces = true; + RestrictRealtime = true; + RestrictSUIDSGID = true; + SystemCallArchitectures = "native"; + SystemCallFilter = [ + "@system-service" + "~@privileged" + "~@resources" + ]; + UMask = "0077"; + }; + }; + + environment.etc."hydra/builder.toml".source = format.generate "builder.toml" ( + lib.filterAttrsRecursive (_: v: v != null) cfg.settings + ); + + nix.settings.trusted-users = [ user ]; + + users = { + groups.hydra = { }; + users.${user} = { + description = "Hydra build agent"; + group = "hydra"; + isSystemUser = true; + }; + }; + }; + + meta.maintainers = with lib.maintainers; [ + conni2461 + das_j + helsinki-Jo + mindavi + ]; +} diff --git a/nixos/modules/services/continuous-integration/hydra/default.nix b/nixos/modules/services/continuous-integration/hydra/default.nix index 76624d4bea7b..7485f134391b 100644 --- a/nixos/modules/services/continuous-integration/hydra/default.nix +++ b/nixos/modules/services/continuous-integration/hydra/default.nix @@ -7,21 +7,33 @@ let cfg = config.services.hydra; + queueRunnerCfg = cfg.queueRunner; + + toml = pkgs.formats.toml { }; baseDir = "/var/lib/hydra"; hydraConf = pkgs.writeScript "hydra.conf" cfg.extraConfig; hydraEnv = { - HYDRA_DBI = cfg.dbi; + HYDRA_DATABASE_URL = cfg.dbUrl; HYDRA_CONFIG = "${baseDir}/hydra.conf"; HYDRA_DATA = "${baseDir}"; }; + # Appends `application_name` so queries can be attributed in pg_stat_activity. + # `%` is doubled because the value lands in systemd `Environment=`, where the + # percent-encoded socket path (`%2Frun%2Fpostgresql`) would be parsed as a + # specifier. + dbUrlWithAppName = + name: + lib.replaceStrings [ "%" ] [ "%%" ] ( + cfg.dbUrl + (if lib.hasInfix "?" cfg.dbUrl then "&" else "?") + "application_name=${name}" + ); + env = { NIX_REMOTE = "daemon"; PGPASSFILE = "${baseDir}/pgpass"; - NIX_REMOTE_SYSTEMS = lib.concatStringsSep ":" cfg.buildMachinesFiles; } // lib.optionalAttrs (cfg.smtpHost != null) { EMAIL_SENDER_TRANSPORT = "SMTP"; @@ -40,9 +52,9 @@ let } // (lib.optionalAttrs cfg.debugServer { DBIC_TRACE = "1"; }); - localDB = "dbi:Pg:dbname=hydra;user=hydra;"; + localDbUrl = "postgres://hydra@%2Frun%2Fpostgresql:5432/hydra"; - haveLocalDB = cfg.dbi == localDB; + haveLocalDB = cfg.dbUrl == localDbUrl; hydra-package = let @@ -80,6 +92,16 @@ let in { + imports = [ + (lib.mkRemovedOptionModule [ "services" "hydra" "dbi" ] '' + Use `services.hydra.dbUrl`, which takes a postgres:// URL instead of a DBI string. + '') + (lib.mkRemovedOptionModule [ "services" "hydra" "buildMachinesFiles" ] '' + The queue runner no longer reads Nix build machines files. Builders now + connect to it via gRPC, see `services.hydra-builder`. + '') + ]; + ###### interface options = { @@ -93,22 +115,102 @@ in ''; }; - dbi = lib.mkOption { + dbUrl = lib.mkOption { type = lib.types.str; - default = localDB; - example = "dbi:Pg:dbname=hydra;host=postgres.example.org;user=foo;"; + default = localDbUrl; + example = "postgres://foo@postgres.example.org:5432/hydra"; description = '' - The DBI string for Hydra database connection. + `postgres://` URL of the Hydra database. - NOTE: Attempts to set `application_name` will be overridden by - `hydra-TYPE` (where TYPE is e.g. `evaluator`, `queue-runner`, - etc.) in all hydra services to more easily distinguish where - queries are coming from. + An `application_name` query parameter is appended per service + (e.g. `hydra-evaluator`), so do not set one here. ''; }; package = lib.mkPackageOption pkgs "hydra" { }; + evaluatorPackage = lib.mkPackageOption pkgs "hydra-evaluator" { }; + + evaluatorSettings = lib.mkOption { + description = '' + Settings for the evaluator, written to + {file}`/etc/hydra/evaluator.toml`. + ''; + default = { }; + type = lib.types.submodule { + freeformType = toml.type; + options = { + max_concurrent_evals = lib.mkOption { + type = lib.types.ints.positive; + default = 4; + description = "How many jobsets to evaluate at once."; + }; + }; + }; + }; + + ws = { + enable = + lib.mkEnableOption "the WebSocket server streaming live build logs to the web interface" + // { + default = true; + example = false; + }; + + package = lib.mkPackageOption pkgs "hydra-ws" { }; + + settings = lib.mkOption { + description = '' + Settings for the WebSocket server, written to + {file}`/etc/hydra/ws.toml`. + ''; + default = { }; + type = lib.types.submodule { + options = { + dbUrl = lib.mkOption { + type = lib.types.singleLineStr; + default = cfg.dbUrl; + defaultText = lib.literalExpression "config.services.hydra.dbUrl"; + description = "PostgreSQL database URL."; + }; + + maxDbConnections = lib.mkOption { + type = lib.types.ints.positive; + default = 128; + description = "Maximum number of PostgreSQL connections."; + }; + + idleGrace = lib.mkOption { + type = lib.types.int; + default = 128; + description = "Idle grace period in seconds before a log tail is stopped."; + }; + + hydraDataDir = lib.mkOption { + type = lib.types.path; + default = baseDir; + defaultText = lib.literalExpression ''"${baseDir}"''; + description = "Hydra data directory."; + }; + }; + }; + }; + + bind = { + address = lib.mkOption { + type = lib.types.singleLineStr; + default = "[::1]"; + description = "Address the WebSocket listener binds to."; + }; + + port = lib.mkOption { + type = lib.types.port; + default = 9283; + description = "Port the WebSocket listener binds to."; + }; + }; + }; + hydraURL = lib.mkOption { type = lib.types.str; description = '' @@ -223,17 +325,6 @@ in description = "Directory that holds Hydra garbage collector roots."; }; - buildMachinesFiles = lib.mkOption { - type = lib.types.listOf lib.types.path; - default = lib.optional (config.nix.buildMachines != [ ]) "/etc/nix/machines"; - defaultText = lib.literalExpression ''lib.optional (config.nix.buildMachines != []) "/etc/nix/machines"''; - example = [ - "/etc/nix/machines" - "/var/lib/hydra/provisioner/machines" - ]; - description = "List of files containing build machines."; - }; - useSubstitutes = lib.mkOption { type = lib.types.bool; default = false; @@ -247,6 +338,324 @@ in are absolute trustworthy. ''; }; + + queueRunner = { + package = lib.mkPackageOption pkgs "hydra-queue-runner" { }; + + settings = lib.mkOption { + description = '' + Reloadable settings for the queue runner, written to + {file}`/etc/hydra/queue-runner.toml`. + ''; + default = { }; + type = lib.types.submodule { + options = { + hydraDataDir = lib.mkOption { + type = lib.types.path; + default = baseDir; + defaultText = lib.literalExpression ''"${baseDir}"''; + description = "Hydra data directory."; + }; + + dbUrl = lib.mkOption { + type = lib.types.singleLineStr; + default = cfg.dbUrl; + defaultText = lib.literalExpression "config.services.hydra.dbUrl"; + description = "PostgreSQL database URL."; + }; + + maxDbConnections = lib.mkOption { + type = lib.types.ints.positive; + default = 128; + description = "Maximum number of PostgreSQL connections."; + }; + + machineSortFn = lib.mkOption { + type = lib.types.enum [ + "SpeedFactorOnly" + "CpuCoreCountWithSpeedFactor" + "BogomipsWithSpeedFactor" + ]; + default = "SpeedFactorOnly"; + description = "Function used to sort machines."; + }; + + machineFreeFn = lib.mkOption { + type = lib.types.enum [ + "Dynamic" + "DynamicWithMaxJobLimit" + "Static" + ]; + default = "Static"; + description = ''Function used to determine "idle" machines.''; + }; + + stepSortFn = lib.mkOption { + type = lib.types.enum [ + "Legacy" + "WithRdeps" + "WithCriticalPath" + ]; + default = "WithRdeps"; + description = "Function used to sort steps."; + }; + + dispatchTriggerTimerInS = lib.mkOption { + type = lib.types.int; + default = 120; + description = '' + Interval in seconds at which the dispatcher is triggered. A + value <= 0 disables the timer, leaving the dispatcher to be + triggered by queue changes only. + ''; + }; + + queueTriggerTimerInS = lib.mkOption { + type = lib.types.int; + default = -1; + description = '' + Interval in seconds at which the queue is triggered. A value + <= 0 disables the timer, leaving the queue to be triggered by + PostgreSQL notifications only. + ''; + }; + + remoteStoreAddr = lib.mkOption { + type = lib.types.listOf lib.types.singleLineStr; + default = [ ]; + description = "Remote store addresses."; + }; + + useSubstitutes = lib.mkOption { + type = lib.types.bool; + default = cfg.useSubstitutes; + defaultText = lib.literalExpression "config.services.hydra.useSubstitutes"; + description = "Whether to substitute paths instead of building them."; + }; + + rootsDir = lib.mkOption { + type = lib.types.nullOr lib.types.path; + default = cfg.gcRootsDir; + defaultText = lib.literalExpression "config.services.hydra.gcRootsDir"; + description = "Directory holding the garbage collector roots."; + }; + + maxRetries = lib.mkOption { + type = lib.types.ints.positive; + default = 5; + description = "Maximum number of retries for a build step."; + }; + + retryInterval = lib.mkOption { + type = lib.types.ints.positive; + default = 60; + description = "Interval in seconds after which a step may be retried."; + }; + + retryBackoff = lib.mkOption { + type = lib.types.float; + default = 3.0; + description = "Additional backoff on top of {option}`retryInterval`."; + }; + + maxUnsupportedTimeInS = lib.mkOption { + type = lib.types.ints.unsigned; + default = 120; + description = "Time in seconds after which unsupported steps are aborted."; + }; + + stopQueueRunAfterInS = lib.mkOption { + type = lib.types.int; + default = 60; + description = '' + Seconds after which a queue run is interrupted early. A value + <= 0 lets queue runs go on for as long as they need. + ''; + }; + + maxConcurrentDownloads = lib.mkOption { + type = lib.types.ints.positive; + default = 5; + description = '' + Maximum number of concurrent downloads per build. Raising this + raises the queue runner's memory usage. + ''; + }; + + concurrentUploadLimit = lib.mkOption { + type = lib.types.ints.positive; + default = 5; + description = "Maximum number of concurrent uploads to S3."; + }; + + tokenPaths = lib.mkOption { + type = lib.types.nullOr (lib.types.listOf lib.types.path); + default = null; + description = "Paths of the accepted authentication tokens."; + }; + + enableFodChecker = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to enable the fixed-output derivation checker, which + collects FODs in a separate queue and schedules them on + machines advertising the mandatory `FOD` feature. + ''; + }; + + usePresignedUploads = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether builders upload to S3 themselves instead of the queue + runner. Requires an S3 remote store as well as substitution on + the builders, see {option}`forcedSubstituters`. + ''; + }; + + overflowStore = lib.mkOption { + default = null; + description = '' + Overflow S3 store. Steps referenced only by the listed jobsets + are uploaded there instead of to the default store. + ''; + type = lib.types.nullOr ( + lib.types.submodule { + options = { + store = lib.mkOption { + type = lib.types.singleLineStr; + example = "s3://overflow?region=eu-west-1"; + description = "S3 store URI of the overflow bucket."; + }; + + jobsets = lib.mkOption { + type = lib.types.listOf lib.types.singleLineStr; + default = [ ]; + example = [ "nixpkgs:trunk" ]; + description = "Jobsets (`project:jobset`) whose exclusive steps go to the overflow store."; + }; + }; + } + ); + }; + + forcedSubstituters = lib.mkOption { + type = lib.types.listOf lib.types.singleLineStr; + default = [ ]; + description = '' + Substituters every builder is required to have. Builders that + do not enable `useSubstitutes` with these substituters are + rejected. + ''; + }; + + maxOutputSize = lib.mkOption { + type = lib.types.ints.unsigned; + default = 0; + description = '' + Per-output NAR size limit in bytes. Builds exceeding it fail + with `NarSizeLimitExceeded`. 0 disables the check. + ''; + }; + + maxSilentTime = lib.mkOption { + type = lib.types.ints.unsigned; + default = 3600; + description = '' + Default maximum silent time in seconds for builds without + `meta.maxSilent`. Also used as a floor for dependency-only + steps. + ''; + }; + + buildTimeout = lib.mkOption { + type = lib.types.ints.unsigned; + default = 36000; + description = '' + Default build timeout in seconds for builds without + `meta.timeout`. Also used as a floor for dependency-only + steps. + ''; + }; + + maxLogSize = lib.mkOption { + type = lib.types.ints.unsigned; + default = 64 * 1024 * 1024; + description = '' + Maximum build log size in bytes before a build fails with + `LogLimitExceeded`. + ''; + }; + }; + }; + }; + + grpc = { + address = lib.mkOption { + type = lib.types.singleLineStr; + default = "[::1]"; + description = '' + Address the gRPC listener binds to. Must be reachable from + machines running {option}`services.hydra-builder`. + ''; + }; + + port = lib.mkOption { + type = lib.types.port; + default = 50051; + description = "Port the gRPC listener binds to."; + }; + }; + + rest = { + address = lib.mkOption { + type = lib.types.singleLineStr; + default = "[::1]"; + description = "Address the REST listener binds to."; + }; + + port = lib.mkOption { + type = lib.types.port; + default = 8080; + description = "Port the REST listener binds to."; + }; + }; + + mtls = lib.mkOption { + default = null; + description = "mTLS material used to authenticate builders."; + type = lib.types.nullOr ( + lib.types.submodule { + options = { + serverCertPath = lib.mkOption { + type = lib.types.path; + description = "Server certificate path."; + }; + + serverKeyPath = lib.mkOption { + type = lib.types.path; + description = "Server key path."; + }; + + clientCaCertPath = lib.mkOption { + type = lib.types.path; + description = "Client CA certificate path."; + }; + }; + } + ); + }; + + awsCredentialsFile = lib.mkOption { + type = lib.types.nullOr lib.types.path; + default = null; + description = '' + Path to an AWS credentials file, exported as + `AWS_SHARED_CREDENTIALS_FILE` to the queue runner. + ''; + }; + }; }; }; @@ -282,10 +691,16 @@ in description = "Hydra queue runner"; group = "hydra"; useDefaultShell = true; - home = "${baseDir}/queue-runner"; # really only to keep SSH happy + home = "${baseDir}/queue-runner"; uid = config.ids.uids.hydra-queue-runner; }; + users.users.hydra-ws = lib.mkIf cfg.ws.enable { + description = "Hydra WebSocket server"; + group = "hydra"; + isSystemUser = true; + }; + users.users.hydra-www = { description = "Hydra web server"; group = "hydra"; @@ -303,6 +718,7 @@ in ''} gc_roots_dir = ${cfg.gcRootsDir} use-substitutes = ${if cfg.useSubstitutes then "1" else "0"} + queue_runner_endpoint = http://${queueRunnerCfg.rest.address}:${toString queueRunnerCfg.rest.port} ''; environment.systemPackages = [ hydra-package ]; @@ -336,7 +752,7 @@ in requires = lib.optional haveLocalDB "postgresql.target"; after = lib.optional haveLocalDB "postgresql.target"; environment = env // { - HYDRA_DBI = "${env.HYDRA_DBI};application_name=hydra-init"; + HYDRA_DATABASE_URL = dbUrlWithAppName "hydra-init"; }; path = [ pkgs.util-linux ]; preStart = '' @@ -404,7 +820,7 @@ in pkgs.bzip2 ]; environment = serverEnv // { - HYDRA_DBI = "${serverEnv.HYDRA_DBI};application_name=hydra-server"; + HYDRA_DATABASE_URL = dbUrlWithAppName "hydra-server"; }; restartTriggers = [ hydraConf ]; serviceConfig = { @@ -420,38 +836,210 @@ in }; systemd.services.hydra-queue-runner = { + description = "Hydra queue runner"; wantedBy = [ "multi-user.target" ]; - requires = [ "hydra-init.service" ]; + requires = [ + "hydra-init.service" + "nix-daemon.socket" + "hydra-queue-runner-rest.socket" + "hydra-queue-runner-grpc.socket" + ]; after = [ "hydra-init.service" "network.target" ]; - path = [ - config.nix.package - hydra-package - pkgs.bzip2 - pkgs.hostname-debian - pkgs.openssh - ]; - restartTriggers = [ hydraConf ]; - environment = env // { - PGPASSFILE = "${baseDir}/pgpass-queue-runner"; # grrr - IN_SYSTEMD = "1"; # to get log severity levels - HYDRA_DBI = "${env.HYDRA_DBI};application_name=hydra-queue-runner"; + reloadTriggers = [ config.environment.etc."hydra/queue-runner.toml".source ]; + + environment = { + NIX_REMOTE = "daemon"; + RUST_BACKTRACE = "1"; + # nix-store wants $HOME for its cache dir. + HOME = "/run/hydra-queue-runner"; + } + // lib.optionalAttrs (queueRunnerCfg.awsCredentialsFile != null) { + AWS_SHARED_CREDENTIALS_FILE = queueRunnerCfg.awsCredentialsFile; }; + serviceConfig = { - ExecStart = "@${hydra-package}/bin/hydra-queue-runner hydra-queue-runner -v"; - ExecStopPost = "${hydra-package}/bin/hydra-queue-runner --unlock"; - User = "hydra-queue-runner"; + Type = "notify"; Restart = "always"; + RestartSec = "5s"; Slice = "system-hydra.slice"; - # Ensure we can get core dumps. - LimitCORE = "infinity"; + # One gRPC stream per builder plus DB pool. 1024 is easily exhausted. + LimitNOFILE = 65536; + + ExecStart = lib.escapeShellArgs ( + [ + (lib.getExe queueRunnerCfg.package) + "--rest-bind" + "-" + "--grpc-bind" + "-" + "--config-path" + "/etc/hydra/queue-runner.toml" + ] + ++ lib.optionals (queueRunnerCfg.mtls != null) [ + "--server-cert-path" + queueRunnerCfg.mtls.serverCertPath + "--server-key-path" + queueRunnerCfg.mtls.serverKeyPath + "--client-ca-cert-path" + queueRunnerCfg.mtls.clientCaCertPath + ] + ); + ExecReload = "${pkgs.util-linux}/bin/kill -HUP $MAINPID"; + + User = "hydra-queue-runner"; + Group = "hydra"; + + RuntimeDirectory = "hydra-queue-runner"; WorkingDirectory = "${baseDir}/queue-runner"; + + # Created by hydra-init. StateDirectory= would chown ${baseDir}. + ReadWritePaths = [ + "/nix/var/nix/gcroots/" + "/nix/var/nix/daemon-socket/socket" + "${baseDir}/build-logs/" + "${baseDir}/queue-runner/" + ] + ++ lib.optionals (lib.hasInfix "%2Frun%2Fpostgresql" queueRunnerCfg.settings.dbUrl) [ + "/run/postgresql/.s.PGSQL.${toString config.services.postgresql.settings.port}" + ]; + ReadOnlyPaths = [ "/nix/" ]; + + CapabilityBoundingSet = ""; + LockPersonality = true; + MemoryDenyWriteExecute = true; + NoNewPrivileges = true; + PrivateDevices = true; + PrivateMounts = true; + PrivateTmp = true; + PrivateUsers = true; + ProtectClock = true; + ProtectControlGroups = true; + ProtectHome = true; + ProtectHostname = true; + ProtectKernelLogs = true; + ProtectKernelModules = true; + ProtectKernelTunables = true; + ProtectSystem = "strict"; + RemoveIPC = true; + RestrictNamespaces = true; + RestrictRealtime = true; + RestrictSUIDSGID = true; + SystemCallArchitectures = "native"; + SystemCallFilter = [ + "@system-service" + "~@privileged" + "~@resources" + ]; + UMask = "0022"; }; }; + systemd.sockets.hydra-queue-runner-rest = { + description = "Hydra queue runner REST socket"; + wantedBy = [ "sockets.target" ]; + socketConfig = { + ListenStream = "${queueRunnerCfg.rest.address}:${toString queueRunnerCfg.rest.port}"; + FileDescriptorName = "rest"; + Service = "hydra-queue-runner.service"; + }; + }; + + systemd.sockets.hydra-queue-runner-grpc = { + description = "Hydra queue runner gRPC socket"; + wantedBy = [ "sockets.target" ]; + socketConfig = { + ListenStream = "${queueRunnerCfg.grpc.address}:${toString queueRunnerCfg.grpc.port}"; + FileDescriptorName = "grpc"; + Service = "hydra-queue-runner.service"; + }; + }; + + environment.etc."hydra/queue-runner.toml".source = toml.generate "queue-runner.toml" ( + lib.filterAttrsRecursive (_: v: v != null) queueRunnerCfg.settings + ); + + systemd.services.hydra-ws = lib.mkIf cfg.ws.enable { + description = "Hydra WebSocket server"; + wantedBy = [ "multi-user.target" ]; + requires = [ "hydra-ws.socket" ]; + after = [ + "hydra-init.service" + "network.target" + ]; + reloadTriggers = [ config.environment.etc."hydra/ws.toml".source ]; + + serviceConfig = { + Type = "notify"; + Restart = "always"; + RestartSec = "5s"; + Slice = "system-hydra.slice"; + + ExecStart = lib.escapeShellArgs [ + (lib.getExe cfg.ws.package) + "--bind" + "-" + "--config-path" + "/etc/hydra/ws.toml" + ]; + + User = "hydra-ws"; + Group = "hydra"; + + RuntimeDirectory = "hydra-ws"; + + ReadOnlyPaths = [ "${baseDir}/build-logs/" ]; + ReadWritePaths = lib.optionals (lib.hasInfix "%2Frun%2Fpostgresql" cfg.ws.settings.dbUrl) [ + "/run/postgresql/.s.PGSQL.${toString config.services.postgresql.settings.port}" + ]; + + CapabilityBoundingSet = ""; + LockPersonality = true; + MemoryDenyWriteExecute = true; + NoNewPrivileges = true; + PrivateDevices = true; + PrivateMounts = true; + PrivateTmp = true; + PrivateUsers = true; + ProtectClock = true; + ProtectControlGroups = true; + ProtectHome = true; + ProtectHostname = true; + ProtectKernelLogs = true; + ProtectKernelModules = true; + ProtectKernelTunables = true; + ProtectSystem = "strict"; + RemoveIPC = true; + RestrictNamespaces = true; + RestrictRealtime = true; + RestrictSUIDSGID = true; + SystemCallArchitectures = "native"; + SystemCallFilter = [ + "@system-service" + "~@privileged" + "~@resources" + ]; + UMask = "0022"; + }; + }; + + systemd.sockets.hydra-ws = lib.mkIf cfg.ws.enable { + description = "Hydra WebSocket socket"; + wantedBy = [ "sockets.target" ]; + socketConfig = { + ListenStream = "${cfg.ws.bind.address}:${toString cfg.ws.bind.port}"; + FileDescriptorName = "ws"; + Service = "hydra-ws.service"; + }; + }; + + environment.etc."hydra/ws.toml" = lib.mkIf cfg.ws.enable { + source = toml.generate "ws.toml" (lib.filterAttrsRecursive (_: v: v != null) cfg.ws.settings); + }; + systemd.services.hydra-evaluator = { wantedBy = [ "multi-user.target" ]; requires = [ "hydra-init.service" ]; @@ -461,17 +1049,31 @@ in "network.target" "network-online.target" ]; - path = with pkgs; [ - hostname-debian - hydra-package - jq + path = [ + pkgs.hostname-debian + pkgs.jq + hydra-package # hydra-eval-jobset + ]; + restartTriggers = [ + hydraConf + config.environment.etc."hydra/evaluator.toml".source ]; - restartTriggers = [ hydraConf ]; environment = env // { - HYDRA_DBI = "${env.HYDRA_DBI};application_name=hydra-evaluator"; + HYDRA_DATABASE_URL = dbUrlWithAppName "hydra-evaluator"; }; serviceConfig = { - ExecStart = "@${hydra-package}/bin/hydra-evaluator hydra-evaluator"; + ExecStart = lib.escapeShellArgs [ + "@${lib.getExe cfg.evaluatorPackage}" + "hydra-evaluator" + "--config-path" + "/etc/hydra/evaluator.toml" + ]; + ExecStopPost = lib.escapeShellArgs [ + (lib.getExe cfg.evaluatorPackage) + "--config-path" + "/etc/hydra/evaluator.toml" + "--unlock" + ]; User = "hydra"; Restart = "always"; WorkingDirectory = baseDir; @@ -479,11 +1081,14 @@ in }; }; + environment.etc."hydra/evaluator.toml".source = + toml.generate "evaluator.toml" cfg.evaluatorSettings; + systemd.services.hydra-update-gc-roots = { requires = [ "hydra-init.service" ]; after = [ "hydra-init.service" ]; environment = env // { - HYDRA_DBI = "${env.HYDRA_DBI};application_name=hydra-update-gc-roots"; + HYDRA_DATABASE_URL = dbUrlWithAppName "hydra-update-gc-roots"; }; serviceConfig = { ExecStart = "@${hydra-package}/bin/hydra-update-gc-roots hydra-update-gc-roots"; @@ -497,7 +1102,7 @@ in wantedBy = [ "multi-user.target" ]; after = [ "hydra-init.service" ]; environment = env // { - HYDRA_DBI = "${env.HYDRA_DBI};application_name=hydra-send-stats"; + HYDRA_DATABASE_URL = dbUrlWithAppName "hydra-send-stats"; }; serviceConfig = { ExecStart = "@${hydra-package}/bin/hydra-send-stats hydra-send-stats"; @@ -514,7 +1119,7 @@ in path = [ pkgs.zstd ]; environment = env // { PGPASSFILE = "${baseDir}/pgpass-queue-runner"; - HYDRA_DBI = "${env.HYDRA_DBI};application_name=hydra-notify"; + HYDRA_DATABASE_URL = dbUrlWithAppName "hydra-notify"; }; serviceConfig = { ExecStart = "@${hydra-package}/bin/hydra-notify hydra-notify"; @@ -567,12 +1172,17 @@ in services.postgresql.enable = lib.mkIf haveLocalDB true; - services.postgresql.identMap = lib.optionalString haveLocalDB '' - hydra hydra hydra - hydra hydra-queue-runner hydra - hydra hydra-www hydra - hydra root hydra - ''; + services.postgresql.identMap = lib.optionalString haveLocalDB ( + '' + hydra hydra hydra + hydra hydra-queue-runner hydra + hydra hydra-www hydra + hydra root hydra + '' + + lib.optionalString cfg.ws.enable '' + hydra hydra-ws hydra + '' + ); services.postgresql.authentication = lib.optionalString haveLocalDB '' local all hydra peer map=hydra diff --git a/nixos/tests/hydra/common.nix b/nixos/tests/hydra/common.nix index 60c7143acc29..b1d84d37c1ec 100644 --- a/nixos/tests/hydra/common.nix +++ b/nixos/tests/hydra/common.nix @@ -1,6 +1,6 @@ { baseConfig = - { pkgs, ... }: + { config, pkgs, ... }: let trivialJob = pkgs.writeTextDir "trivial.nix" '' { trivial = derivation { @@ -39,9 +39,19 @@ hydraURL = "example.com"; notificationSender = "example@example.com"; extraConfig = '' - email_notification = 1 + + build = 1 + ''; }; + + # Local build agent so that queued builds actually get executed. + services.hydra-builder = { + enable = true; + queueRunnerAddr = "http://[::1]:${toString config.services.hydra.queueRunner.grpc.port}"; + }; + systemd.services.hydra-builder.after = [ "hydra-queue-runner.service" ]; + services.postfix.enable = true; nix.settings.substituters = [ ]; nix.enable = true; # disabled by default. See all-tests.nix / tag(no-nix-by-default) diff --git a/nixos/tests/hydra/default.nix b/nixos/tests/hydra/default.nix index 91913102bd98..66f43ca2b338 100644 --- a/nixos/tests/hydra/default.nix +++ b/nixos/tests/hydra/default.nix @@ -21,9 +21,12 @@ in machine.wait_for_unit("postgresql.target") # test whether the actual hydra daemons are running machine.wait_for_unit("hydra-init.service") - machine.require_unit_state("hydra-queue-runner.service") + machine.wait_for_unit("hydra-queue-runner.service") machine.require_unit_state("hydra-evaluator.service") machine.require_unit_state("hydra-notify.service") + machine.wait_for_open_port(50051) + machine.wait_for_unit("hydra-builder.service") + machine.wait_for_unit("hydra-ws.service") machine.succeed("hydra-create-user admin --role admin --password admin") @@ -37,8 +40,15 @@ in 'curl -L -s http://localhost:3000/build/1 -H "Accept: application/json" | jq .buildstatus | xargs test 0 -eq' ) + # The web interface reads the machine list from the queue runner's REST + # endpoint, which it only knows about through `queue_runner_endpoint` in + # hydra.conf. machine.wait_until_succeeds( - 'journalctl -eu hydra-notify.service -o cat | grep -q "sending mail notification to hydra@localhost"' + 'curl -L -s http://localhost:3000/machines -H "Accept: application/json" | jq -e "length > 0"' + ) + + machine.wait_until_succeeds( + 'journalctl -eu hydra-notify.service -o cat | grep -q "sending mail notification for changed build status to hydra@localhost"' ) ''; } diff --git a/pkgs/applications/editors/vim/plugins/generated.nix b/pkgs/applications/editors/vim/plugins/generated.nix index 31e2e68341db..f96ce7b19b8a 100644 --- a/pkgs/applications/editors/vim/plugins/generated.nix +++ b/pkgs/applications/editors/vim/plugins/generated.nix @@ -2323,6 +2323,20 @@ final: prev: { meta.hydraPlatforms = [ ]; }; + carderne-pi-nvim = buildVimPlugin { + pname = "carderne-pi-nvim"; + version = "0.2.5"; + src = fetchFromGitHub { + owner = "carderne"; + repo = "pi-nvim"; + tag = "v0.2.5"; + hash = "sha256-1ZpHYfpgdezwM5go5KAPhjPeKDIgKgmVSCVGgbPv63o="; + }; + meta.homepage = "https://github.com/carderne/pi-nvim/"; + meta.license = getLicenseFromSpdxId "MIT"; + meta.hydraPlatforms = [ ]; + }; + catppuccin-nvim = buildVimPlugin { pname = "catppuccin-nvim"; version = "2.0.0"; @@ -3567,6 +3581,20 @@ final: prev: { meta.hydraPlatforms = [ ]; }; + code-helper-nvim = buildVimPlugin { + pname = "code-helper-nvim"; + version = "0-unstable-2026-10-04"; + src = fetchFromGitHub { + owner = "sergioia-dev"; + repo = "code-helper-nvim"; + rev = "318856be95cafd863c7a1983a1b7381c6454b906"; + hash = "sha256-OHrZiroVLJEmUKIzuw8l59Ql3Xmv8rImrqtGof9DiUM="; + }; + meta.homepage = "https://github.com/sergioia-dev/code-helper-nvim/"; + meta.license = getLicenseFromSpdxId "MIT"; + meta.hydraPlatforms = [ ]; + }; + codecompanion-history-nvim = buildVimPlugin { pname = "codecompanion-history.nvim"; version = "0-unstable-2026-01-22"; @@ -4450,6 +4478,20 @@ final: prev: { meta.hydraPlatforms = [ ]; }; + dadbod-grip-nvim = buildVimPlugin { + pname = "dadbod-grip.nvim"; + version = "3.11.0"; + src = fetchFromGitHub { + owner = "joryeugene"; + repo = "dadbod-grip.nvim"; + tag = "v3.11.0"; + hash = "sha256-iy3J41D1X0u7pTqSSgvBL5ATQeilon2VRDHFxzFAEqs="; + }; + meta.homepage = "https://github.com/joryeugene/dadbod-grip.nvim/"; + meta.license = getLicenseFromSpdxId "MIT"; + meta.hydraPlatforms = [ ]; + }; + dailies-nvim = buildVimPlugin { pname = "dailies.nvim"; version = "0-unstable-2025-04-21"; @@ -18360,6 +18402,20 @@ final: prev: { meta.hydraPlatforms = [ ]; }; + toggable-term-nvim = buildVimPlugin { + pname = "toggable-term-nvim"; + version = "0-unstable-2026-10-04"; + src = fetchFromGitHub { + owner = "sergioia-dev"; + repo = "toggable-term-nvim"; + rev = "c61ddbcad7484b1306d643bd2a41699fbf0239d6"; + hash = "sha256-ellFepBoskQ6iIV5lU7OSSyD7StOHsUgQFRoG+wbNDE="; + }; + meta.homepage = "https://github.com/sergioia-dev/toggable-term-nvim/"; + meta.license = getLicenseFromSpdxId "MIT"; + meta.hydraPlatforms = [ ]; + }; + toggleterm-nvim = buildVimPlugin { pname = "toggleterm.nvim"; version = "2.13.1-unstable-2025-03-09"; diff --git a/pkgs/applications/editors/vim/plugins/non-generated/hermes-nvim/default.nix b/pkgs/applications/editors/vim/plugins/non-generated/hermes-nvim/default.nix index 3f42d8339f7f..f029d3f0360e 100644 --- a/pkgs/applications/editors/vim/plugins/non-generated/hermes-nvim/default.nix +++ b/pkgs/applications/editors/vim/plugins/non-generated/hermes-nvim/default.nix @@ -8,17 +8,20 @@ curl, cacert, jq, + nix, + gnugrep, + gnused, common-updater-scripts, nix-prefetch-scripts, pkg-config, }: let - version = "0.12.1"; + version = "0.14.0"; src = fetchzip { url = "https://github.com/Ruddickmg/hermes.nvim/archive/refs/tags/v${version}.tar.gz"; - hash = "sha256-chPhu7e3LG28DAzkJRWEIG5tVnKXrF+ctc23ZwQc8o0="; + hash = "sha256-YUe+Mg1StwcxpcIcWr9T/32nkH921UranMM0bE+7lu8="; }; dejavuFont = fetchzip { @@ -57,7 +60,7 @@ rustPlatform.buildRustPackage (finalAttrs: { inherit version src; __structuredAttrs = true; - cargoHash = "sha256-cKMurBrYpCv0F6AvAKycsCFbY1tl35WNgyBwh5T3oao="; + cargoHash = "sha256-X1YI0iT3/5hncU0M5qJY+12nO6Et4B/xqwvjaq8AV1Q="; cargoBuildFeatures = [ "with-icons" ]; @@ -86,7 +89,10 @@ rustPlatform.buildRustPackage (finalAttrs: { inherit agentSvgs dejavuFont; tests.basic = - runCommand "hermes-nvim-test-basic" { nativeBuildInputs = [ finalAttrs.finalPackage ]; } + runCommand "hermes-nvim-test-basic" + { + nativeBuildInputs = [ finalAttrs.finalPackage ]; + } '' test -f "${finalAttrs.finalPackage}/lua/hermes/init.lua" test -f "${finalAttrs.finalPackage}/plugin/hermes.lua" @@ -101,6 +107,9 @@ rustPlatform.buildRustPackage (finalAttrs: { lib.makeBinPath [ curl jq + nix + gnugrep + gnused common-updater-scripts nix-prefetch-scripts ] @@ -112,6 +121,25 @@ rustPlatform.buildRustPackage (finalAttrs: { fi update-source-version "vimPlugins.hermes-nvim" "$NEW_VERSION" --ignore-same-version + PKG_FILE="pkgs/applications/editors/vim/plugins/non-generated/hermes-nvim/default.nix" + + NEW_CARGO_HASH=$( + nix-build --no-out-link -E ' + let + pkgs = import ./. {}; + pkg = pkgs.vimPlugins.hermes-nvim; + in pkg.cargoDeps.overrideAttrs (old: { + vendorStaging = old.vendorStaging.overrideAttrs (_: { + outputHash = ""; + outputHashAlgo = "sha256"; + }); + }) + ' 2>&1 | grep -oP 'got:\s+\K\S+' + ) || true + if [[ -n "$NEW_CARGO_HASH" ]]; then + sed -i "s|cargoHash = \"sha256-[^\"]*\";|cargoHash = \"$NEW_CARGO_HASH\";|" "$PKG_FILE" + fi + NEW_SVG_HASH=$( nix-build --no-out-link -E ' let @@ -121,11 +149,10 @@ rustPlatform.buildRustPackage (finalAttrs: { outputHash = ""; outputHashAlgo = "sha256"; }) - ' 2>&1 | grep -oP 'got: \K.*' + ' 2>&1 | grep -oP 'got:\s+\K\S+' ) || true if [[ -n "$NEW_SVG_HASH" ]]; then - sed -i "s|outputHash = \"[^\"]*\";|outputHash = \"$NEW_SVG_HASH\";|" \ - "pkgs/applications/editors/vim/plugins/non-generated/hermes-nvim/default.nix" + sed -i "s|outputHash = \"sha256-[^\"]*\";|outputHash = \"$NEW_SVG_HASH\";|" "$PKG_FILE" fi ''; }; diff --git a/pkgs/applications/editors/vim/plugins/overrides.nix b/pkgs/applications/editors/vim/plugins/overrides.nix index 9dc038f7af46..d408eca5e25e 100644 --- a/pkgs/applications/editors/vim/plugins/overrides.nix +++ b/pkgs/applications/editors/vim/plugins/overrides.nix @@ -1167,6 +1167,15 @@ assertNoAdditions { }; }); + dadbod-grip-nvim = super.dadbod-grip-nvim.overrideAttrs { + # Optional pickers: these adapters probe for telescope/snacks with pcall and + # fall back to the built-in picker when the dependency is absent. + checkInputs = with self; [ + snacks-nvim + telescope-nvim + ]; + }; + dailies-nvim = super.dailies-nvim.overrideAttrs { runtimeDeps = [ dailies diff --git a/pkgs/applications/editors/vim/plugins/vim-plugin-names b/pkgs/applications/editors/vim/plugins/vim-plugin-names index b11557364843..2e756d412a75 100644 --- a/pkgs/applications/editors/vim/plugins/vim-plugin-names +++ b/pkgs/applications/editors/vim/plugins/vim-plugin-names @@ -164,6 +164,7 @@ https://github.com/kwkarlwang/bufresize.nvim/,, https://github.com/bullets-vim/bullets.vim/,, https://github.com/itchyny/calendar.vim/,, https://github.com/bkad/camelcasemotion/,, +https://github.com/carderne/pi-nvim/,,carderne-pi-nvim https://github.com/catppuccin/nvim/,,catppuccin-nvim https://github.com/catppuccin/vim/,,catppuccin-vim https://github.com/tyru/caw.vim/,, @@ -253,6 +254,7 @@ https://github.com/iamcco/coc-tailwindcss/,, https://github.com/neoclide/coc.nvim/,release, https://github.com/ahf/cocci-syntax/,, https://github.com/manicmaniac/coconut.vim/,, +https://github.com/sergioia-dev/code-helper-nvim/,, https://github.com/ravitemer/codecompanion-history.nvim/,, https://github.com/franco-ruggeri/codecompanion-lualine.nvim/,, https://github.com/franco-ruggeri/codecompanion-spinner.nvim/,, @@ -316,6 +318,7 @@ https://github.com/gbprod/cutlass.nvim/,, https://github.com/scottmckendry/cyberdream.nvim/,, https://github.com/ghillb/cybu.nvim/,, https://github.com/d2lang/d2-vim/,, +https://github.com/joryeugene/dadbod-grip.nvim/,, https://github.com/JachymPutta/dailies.nvim/,, https://github.com/Koalhack/darcubox-nvim/,, https://github.com/ptdewey/darkearth-nvim/,, @@ -1309,6 +1312,7 @@ https://github.com/aserowy/tmux.nvim/,, https://github.com/edkolev/tmuxline.vim/,, https://github.com/folke/todo-comments.nvim/,, https://github.com/freitass/todo.txt-vim/,, +https://github.com/sergioia-dev/toggable-term-nvim/,, https://github.com/akinsho/toggleterm.nvim/,, https://github.com/tiagovla/tokyodark.nvim/,, https://github.com/folke/tokyonight.nvim/,, diff --git a/pkgs/applications/editors/vscode/extensions/anthropic.claude-code/default.nix b/pkgs/applications/editors/vscode/extensions/anthropic.claude-code/default.nix index c78bb35951e1..92ac521e3266 100644 --- a/pkgs/applications/editors/vscode/extensions/anthropic.claude-code/default.nix +++ b/pkgs/applications/editors/vscode/extensions/anthropic.claude-code/default.nix @@ -21,22 +21,22 @@ vscode-utils.buildVscodeMarketplaceExtension (finalAttrs: { sources = { "x86_64-linux" = { arch = "linux-x64"; - hash = "sha256-TY0MaNfh/Iv0K/AYy0frD71US0NFpgk7k2yrClTeXTc="; + hash = "sha256-dUWGAI6AtFbMToKDAUxiEzsPspfka6kitMJ9+l1moz0="; }; "aarch64-linux" = { arch = "linux-arm64"; - hash = "sha256-BGEyoZX6WARlrPevsunwrX5C9YvhTTURuzRi9A/c594="; + hash = "sha256-y/z/tqieh+mdrUXfq7wqgRXndvdmKQ5ocsEwhFN/N3c="; }; "aarch64-darwin" = { arch = "darwin-arm64"; - hash = "sha256-QTEgBlSjb/Y8eYBl9HQVgZCyeDIXZR5gzEizv/JxVN0="; + hash = "sha256-fzywaeVkfUKgVDEnsKn3jIuKFOoiyT1Gpy332cn7ZfA="; }; }; in { name = "claude-code"; publisher = "anthropic"; - version = "2.1.287"; + version = "2.1.289"; } // sources.${stdenvNoCC.hostPlatform.system} or (throw "Unsupported system ${stdenvNoCC.hostPlatform.system}"); diff --git a/pkgs/by-name/_3/_389-ds-base/package.nix b/pkgs/by-name/_3/_389-ds-base/package.nix index d88cca3418c8..e2330427cda8 100644 --- a/pkgs/by-name/_3/_389-ds-base/package.nix +++ b/pkgs/by-name/_3/_389-ds-base/package.nix @@ -30,8 +30,8 @@ rustPlatform, rustc, openssl, - withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, - systemd, + withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemdLibs, + systemdLibs, zlib, rsync, withCockpit ? true, @@ -90,7 +90,7 @@ stdenv.mkDerivation (finalAttrs: { openssl zlib ] - ++ lib.optional withSystemd systemd + ++ lib.optional withSystemd systemdLibs ++ lib.optional withOpenldap openldap ++ lib.optional withBdb db ++ lib.optional withNetSnmp net-snmp; diff --git a/pkgs/by-name/bi/biboumi/package.nix b/pkgs/by-name/bi/biboumi/package.nix index 5f6794d43965..f58d29853033 100644 --- a/pkgs/by-name/bi/biboumi/package.nix +++ b/pkgs/by-name/bi/biboumi/package.nix @@ -7,7 +7,7 @@ expat, libiconv, botan3, - systemd, + systemdLibs, pkg-config, python3Packages, withIDN ? true, @@ -44,7 +44,7 @@ stdenv.mkDerivation { libuuid expat libiconv - systemd + systemdLibs botan3 ] ++ lib.optional withIDN libidn diff --git a/pkgs/by-name/bl/blastem/package.nix b/pkgs/by-name/bl/blastem/package.nix index b58c6bb6101a..32abf6dd8f23 100644 --- a/pkgs/by-name/bl/blastem/package.nix +++ b/pkgs/by-name/bl/blastem/package.nix @@ -2,43 +2,48 @@ lib, stdenv, fetchhg, - pkg-config, + makeBinaryWrapper, - SDL2, + pkg-config, + python3, + glew, gtk3, + SDL2, + testers, }: stdenv.mkDerivation (finalAttrs: { pname = "blastem"; - version = "0.6.2-unstable-2024-08-14"; + version = "1.0.0"; src = fetchhg { url = "https://www.retrodev.com/repos/blastem"; - rev = "aa888682faa0"; - hash = "sha256-0xw9O0o1pkJiXHyZer4nMJeLlRXS3Z4YYoLgfkrz3Yo="; + rev = "v${finalAttrs.version}"; + hash = "sha256-Fs78GFmvndJz+Ngpzw3bRyL8IX8UUJBAbV3TcNbHJHA="; }; - # will probably be fixed in https://github.com/NixOS/nixpkgs/pull/302481 - postPatch = lib.optionalString stdenv.hostPlatform.isDarwin '' + postPatch = '' substituteInPlace Makefile \ - --replace-fail "-flto" "" + --replace-fail '/bin/echo' 'echo' + patchShebangs cpu_dsl.py ''; nativeBuildInputs = [ - pkg-config makeBinaryWrapper + pkg-config + python3 ]; buildInputs = [ gtk3 - SDL2 glew + SDL2 ]; # Note: menu.bin cannot be generated yet, because it would - # need the `vasmm68k_mot` executable (part of vbcc for amigaos68k + # need the `vasmm68k_mot` executable (part of vbcc for amigaos68k) # Luckily, menu.bin doesn't need to be present for the emulator to function makeFlags = [ "HOST_ZLIB=1" ]; @@ -49,7 +54,7 @@ stdenv.mkDerivation (finalAttrs: { runHook preInstall # not sure if any executable other than blastem is really needed here - install -Dm755 blastem dis zdis termhelper -t $out/share/blastem + install -Dm755 blastem dis zdis upddis sh2dis termhelper -t $out/share/blastem install -Dm644 gamecontrollerdb.txt default.cfg rom.db -t $out/share/blastem cp -r shaders $out/share/blastem/shaders @@ -62,18 +67,20 @@ stdenv.mkDerivation (finalAttrs: { passthru.tests.version = testers.testVersion { package = finalAttrs.finalPackage; command = "blastem -v"; - version = "0.6.3-pre"; # remove line when moving to a stable version }; meta = { - description = "Fast and accurate Genesis emulator"; + description = "Fast and accurate emulator for Sega's 16-bit and 8-bit consoles"; + longDescription = '' + BlastEm is a free and Open Source emulator for Sega's 16-bit and 8-bit consoles. + It's fast enough for your old PC and accurate enough for the most demanding demos. + While BlastEm's primary focus is the Genesis (known as the Megadrive outside North America), + it also supports the Sega CD, 32X, Master System, Game Gear, SG-1000, SC-3000, Sega Pico and Yamaha Copera. + ''; homepage = "https://www.retrodev.com/blastem/"; license = lib.licenses.gpl3Plus; mainProgram = "blastem"; maintainers = with lib.maintainers; [ tomasajt ]; - platforms = [ - "i686-linux" - "x86_64-linux" - ]; + platforms = lib.platforms.linux ++ lib.platforms.darwin; }; }) diff --git a/pkgs/by-name/bu/butler/package.nix b/pkgs/by-name/bu/butler/package.nix index 3d99441df643..91639876035d 100644 --- a/pkgs/by-name/bu/butler/package.nix +++ b/pkgs/by-name/bu/butler/package.nix @@ -7,20 +7,20 @@ buildGoModule (finalAttrs: { pname = "butler"; - version = "15.30.0"; + version = "15.31.0"; src = fetchFromGitHub { owner = "itchio"; repo = "butler"; tag = "v${finalAttrs.version}"; - hash = "sha256-zq6ZmPNhRrp2MiDr6VElPMJGXEEkdK9ZjI0XUM0nED8="; + hash = "sha256-gH0aSS5VvKdBr9zD7CGHo3Qhs/MFkJWVMaG9m9yDPXw="; }; buildInputs = [ brotli ]; doCheck = false; # disabled because the tests don't work in a non-FHS compliant environment. - vendorHash = "sha256-kNc3twHNWgxJEVDte4GO6da8KrUmClaFZuip1bb1fMM="; + vendorHash = "sha256-4Uleff7XO9hs72/G+s8Ak1yaDLNpdHZa2GKx1aCtLZI="; meta = { description = "Command-line itch.io helper"; diff --git a/pkgs/by-name/ca/caddy/package.nix b/pkgs/by-name/ca/caddy/package.nix index 0f544a4b22e9..23e44398b09f 100644 --- a/pkgs/by-name/ca/caddy/package.nix +++ b/pkgs/by-name/ca/caddy/package.nix @@ -1,37 +1,39 @@ { lib, - buildGoModule, + stdenv, + buildPackages, callPackage, + buildGoModule, fetchFromGitHub, + installShellFiles, + versionCheckHook, + writableTmpDirAsHomeHook, testers, nixosTests, - caddy, - installShellFiles, - stdenv, - writableTmpDirAsHomeHook, - versionCheckHook, + nix-update-script, }: buildGoModule (finalAttrs: { pname = "caddy"; - version = "2.11.4"; + version = "2.11.7"; __structuredAttrs = true; + __darwinAllowLocalNetworking = true; + src = fetchFromGitHub { owner = "caddyserver"; repo = "caddy"; tag = "v${finalAttrs.version}"; # remember to update hashes for `dist` and `plugins` test! - hash = "sha256-wzk8KRZfDCbbjRlBwkoKAoMjOhV4xF3yuXUueqtl1xM="; + hash = "sha256-6+USPwF6LzDWUjrNRL2ncxSz5KmqJM0L/6o03Lh8YD8="; }; - vendorHash = "sha256-2GwSM7EKN9GwN6kte7CekpXIJ0vzHhhsnrs3TC6vTW4="; + vendorHash = "sha256-kJOl5h9gSfEK6ROT/MYOkBUr6MhiNBlbZVZPqwNpbBk="; ldflags = [ "-s" - "-w" - "-X github.com/caddyserver/caddy/v2.CustomVersion=${finalAttrs.version}" + "-X github.com/caddyserver/caddy/v2.CustomVersion=v${finalAttrs.version}" ]; # matches upstream since v2.8.0 @@ -45,44 +47,51 @@ buildGoModule (finalAttrs: { nativeCheckInputs = [ writableTmpDirAsHomeHook ]; - __darwinAllowLocalNetworking = true; + checkFlags = [ "-skip=^TestReverseProxySNIPlaceHolder$" ]; postInstall = '' install -Dm644 ${finalAttrs.passthru.dist}/init/caddy.service ${finalAttrs.passthru.dist}/init/caddy-api.service -t $out/lib/systemd/system - substituteInPlace $out/lib/systemd/system/caddy.service \ - --replace-fail "/usr/bin/caddy" "$out/bin/caddy" - substituteInPlace $out/lib/systemd/system/caddy-api.service \ + substituteInPlace $out/lib/systemd/system/caddy.service $out/lib/systemd/system/caddy-api.service \ --replace-fail "/usr/bin/caddy" "$out/bin/caddy" '' - + lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) '' - # Generating man pages and completions fail on cross-compilation - # https://github.com/NixOS/nixpkgs/issues/308283 + + lib.optionalString (stdenv.hostPlatform.emulatorAvailable buildPackages) ( + let + emulator = stdenv.hostPlatform.emulator buildPackages; + in + '' + ${emulator} $out/bin/caddy manpage --directory manpages + installManPage manpages/* - $out/bin/caddy manpage --directory manpages - installManPage manpages/* - - installShellCompletion --cmd caddy \ - --bash <($out/bin/caddy completion bash) \ - --fish <($out/bin/caddy completion fish) \ - --zsh <($out/bin/caddy completion zsh) - ''; + installShellCompletion --cmd caddy \ + --bash <(${emulator} $out/bin/caddy completion bash) \ + --fish <(${emulator} $out/bin/caddy completion fish) \ + --zsh <(${emulator} $out/bin/caddy completion zsh) + '' + ); doInstallCheck = true; - nativeInstallCheckInputs = [ - writableTmpDirAsHomeHook - versionCheckHook - ]; versionCheckKeepEnvironment = [ "HOME" ]; + nativeInstallCheckInputs = [ + versionCheckHook + writableTmpDirAsHomeHook + ]; passthru = { - withPlugins = callPackage ./plugins.nix { inherit caddy; }; + withPlugins = callPackage ./plugins.nix { caddy = finalAttrs.finalPackage; }; dist = fetchFromGitHub { owner = "caddyserver"; repo = "dist"; tag = "v${finalAttrs.version}"; - hash = "sha256-oRQfQH1GKjAjVMj+dZo1f1+HOaOdJIyEfod0iGLYcc8="; + hash = "sha256-KvdaqiX06I1ft+p67J1ISgP512SoZ4syDzfe888ZqGI="; + }; + + updateScript = nix-update-script { + extraArgs = [ + "--custom-dep" + "dist" + ]; }; tests = { diff --git a/pkgs/by-name/ca/caddy/plugins.nix b/pkgs/by-name/ca/caddy/plugins.nix index 2b0910f848ba..2dfb72c98028 100644 --- a/pkgs/by-name/ca/caddy/plugins.nix +++ b/pkgs/by-name/ca/caddy/plugins.nix @@ -63,6 +63,15 @@ caddy.overrideAttrs ( git ]; dontUnpack = true; + + env.GOTOOLCHAIN = "local"; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ + "GIT_PROXY_COMMAND" + "SOCKS_SERVER" + "GOPROXY" + ]; + buildPhase = let withArgs = concatMapStrings (plugin: "--with ${plugin} ") pluginsSorted; diff --git a/pkgs/by-name/ca/caddy/plugins.test.nix b/pkgs/by-name/ca/caddy/plugins.test.nix index 7c223c860436..70bb530a8480 100644 --- a/pkgs/by-name/ca/caddy/plugins.test.nix +++ b/pkgs/by-name/ca/caddy/plugins.test.nix @@ -14,7 +14,7 @@ package = pkgs.caddy.withPlugins { plugins = [ "github.com/caddyserver/replace-response@v0.0.0-20250618171559-80962887e4c6" ]; - hash = "sha256-oj0IpspxslpNZbJFsexh0W2Sja19XRUsbShoCuY6qkQ="; + hash = "sha256-RvnrhgktjwNkG/3/th2q/ec6g7fMfGn6qLlGcz2B4TI="; }; globalConfig = '' diff --git a/pkgs/by-name/cg/cgif/package.nix b/pkgs/by-name/cg/cgif/package.nix index 50b3e62f821b..5df187181bde 100644 --- a/pkgs/by-name/cg/cgif/package.nix +++ b/pkgs/by-name/cg/cgif/package.nix @@ -8,13 +8,13 @@ stdenv.mkDerivation (finalAttrs: { pname = "cgif"; - version = "0.5.3"; + version = "0.5.4"; src = fetchFromGitHub { owner = "dloebl"; repo = "cgif"; tag = "v${finalAttrs.version}"; - hash = "sha256-sZan1SLY4HGoifgGOb+uo4/q4dtxZuWAYhMbvdl/Ap8="; + hash = "sha256-rWw7dlqS/NsrrtRfYfmnC6ubHJLie5301S9C0uognnw="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/cl/claude-code/manifest.zst.json b/pkgs/by-name/cl/claude-code/manifest.zst.json index b5effaa6c2ea..b353d2151808 100644 --- a/pkgs/by-name/cl/claude-code/manifest.zst.json +++ b/pkgs/by-name/cl/claude-code/manifest.zst.json @@ -1,63 +1,61 @@ { - "version": "2.1.287", + "version": "2.1.289", "manifestSignatureEnforcement": "flag", - "commit": "3c446a1b98aceb99a6cdee0f84a8bea42f4a8937", - "modsCommit": "6160717d8994f236ab381cf534fc1cde5347c12f", - "buildDate": "2026-10-01T16:27:39Z", + "commit": "736d26eef42d1e3017e07e6d5bd0970b8c3a068f", + "modsCommit": "52c76441cae91f6891e4712306bffb057ff6fec5", + "buildDate": "2026-10-03T19:39:42Z", "platforms": { "darwin-arm64": { "binary": "claude.zst", - "checksum": "2701dac04e02acbea7d7584fc35e04adddf6f24021d321e3ba7eb95994edcf96", - "size": 75949326, + "checksum": "44404b386c30be106533bbd260b689d22cedb6956a6ae70118ba96a32711a82b", + "size": 76604429, "bundle": { - "checksum": "8939dd3a906fd909614c651595ba3636e5620cb1aafcf99d3d5ecd9b6b86c693", - "size": 75962691 + "checksum": "ee67e3f1ea60471c9e78f7c4b1cf30be832862afeec0b80805207d3eee140046", + "size": 76620437 } }, "darwin-x64": { "binary": "claude.zst", - "checksum": "e4c6177a49a726d1a65dadf2fb08cdde0232a37a60017668246ab9246fcf11ad", - "size": 80136583, + "checksum": "104d246d33eecb9750b26eecae258ec81bb02cf8cda8ccd6cbc2d00f6664d176", + "size": 80786935, "bundle": { - "checksum": "dc23e02cbacb6762d4033998e76e182459e7a539ea698eebe267207563def62d", - "size": 80141664 + "checksum": "1a416eb22c68a7a35ad50a28a6eaa56227ddb50ea661786ffb67677b134894ac", + "size": 80788940 } }, "linux-arm64": { "binary": "claude.zst", - "checksum": "f95d466d03381abe9effcbcfe8408704262eb8861af3a1fc20b8e0563c1f770b", - "size": 85057873 + "checksum": "9bae454cf4f886a2c7833746a9253d877b65c24c4c4403689a573bc47bf4b35a", + "size": 85691403 }, "linux-x64": { "binary": "claude.zst", - "checksum": "add364007462fe694a95aa68c78bdf7a71b1ddf687f80dda603f58cc80cde574", - "size": 85795355 + "checksum": "66f72a868a42ca10e5462ab78a88fd9f5576486f59b32a0afc5910ab4b73b765", + "size": 86429541 }, "linux-arm64-musl": { "binary": "claude.zst", - "checksum": "b277e35a54c5c3f891791276b1b5ca8959ab89c45e2123906f26c3b0c489c80a", - "size": 83460752 + "checksum": "84f9baadb049624c58165510498427269ce0c07b31d597ac21c370808c359549", + "size": 84096543 }, "linux-x64-musl": { "binary": "claude.zst", - "checksum": "43f30b92560d69d1942dc7e9e4772a9c24f99cda2d71a1dc46b6033398d47a01", - "size": 84231480 + "checksum": "4ef0cfc150a4c8cf82bd4a726828980aae965e6db8084d00191befab9234f123", + "size": 84854125 }, "win32-x64": { "binary": "claude.exe.zst", - "checksum": "0d03949c88db791ddee203b61c1cfbd69bf84214facc17dcfcd0c0987f6c27de", - "size": 88089498 + "checksum": "e1f0154146bb2618ea9943fa25778362182f8f1bf6c65f8dfd1a68a9a1d2b897", + "size": 88725729 }, "win32-arm64": { "binary": "claude.exe.zst", - "checksum": "bd8a2ec0abb532aea9e4f6a70177193cd7e06e4f4803d63fe75ac15442160dca", - "size": 84412071 + "checksum": "2ddfd5eeaff95051dc32e0b03e441f97fc10af43747402194fa7793e21827348", + "size": 85047493 } }, "sdkCompat": { "testedWrapperVersions": [ - "0.3.247", - "0.3.248", "0.3.250", "0.3.251", "0.3.252", diff --git a/pkgs/by-name/co/corosync-qdevice/package.nix b/pkgs/by-name/co/corosync-qdevice/package.nix index 9989c7693c39..f8a5c5da87b2 100644 --- a/pkgs/by-name/co/corosync-qdevice/package.nix +++ b/pkgs/by-name/co/corosync-qdevice/package.nix @@ -8,7 +8,7 @@ libqb, nss, nspr, - systemd, + systemdLibs, versionCheckHook, }: @@ -33,7 +33,7 @@ stdenv.mkDerivation (finalAttrs: { libqb nss nspr - systemd + systemdLibs ]; configureFlags = [ diff --git a/pkgs/by-name/co/corosync/package.nix b/pkgs/by-name/co/corosync/package.nix index 97427d6769fe..a83bb61cd856 100644 --- a/pkgs/by-name/co/corosync/package.nix +++ b/pkgs/by-name/co/corosync/package.nix @@ -9,7 +9,7 @@ nss, nspr, libqb, - systemd, + systemdLibs, dbus, rdma-core, libstatgrab, @@ -51,7 +51,7 @@ stdenv.mkDerivation (finalAttrs: { nss nspr libqb - systemd.dev + systemdLibs.dev ] ++ optional enableDbus dbus ++ optional enableInfiniBandRdma rdma-core diff --git a/pkgs/by-name/cr/croc/package.nix b/pkgs/by-name/cr/croc/package.nix index 865a49bb0cd0..be659800d032 100644 --- a/pkgs/by-name/cr/croc/package.nix +++ b/pkgs/by-name/cr/croc/package.nix @@ -11,16 +11,16 @@ buildGo127Module (finalAttrs: { pname = "croc"; - version = "11.5.3"; + version = "11.5.4"; src = fetchFromGitHub { owner = "schollz"; repo = "croc"; rev = "v${finalAttrs.version}"; - hash = "sha256-Q+1KK+HA3SC9Kl7YV+ZfIMLUJMu+wjnIknRqn+l6cdM="; + hash = "sha256-QF++O86FqyTE/s0BiFhFts80/DCXPU1xAqeTMtviE2E="; }; - vendorHash = "sha256-6B7KZd0Y/RvV9q9U8kHFnKqkDX7uA1tCW2vaFnfeQZ0="; + vendorHash = "sha256-eiuycihsdYZqdobRsMlryyQOhOeDIUAyM7cUavTPv+o="; subPackages = [ "." ]; diff --git a/pkgs/by-name/do/dovecot/generic.nix b/pkgs/by-name/do/dovecot/generic.nix index 54e5665a6b29..9beeb953ff2b 100644 --- a/pkgs/by-name/do/dovecot/generic.nix +++ b/pkgs/by-name/do/dovecot/generic.nix @@ -13,7 +13,7 @@ bison, perl, pkg-config, - systemd, + systemdLibs, openssl, bzip2, lz4, @@ -103,7 +103,7 @@ stdenv.mkDerivation (finalAttrs: { xapian ] ++ lib.optionals (stdenv.hostPlatform.isLinux) [ - systemd + systemdLibs pam libcap inotify-tools diff --git a/pkgs/by-name/en/entt/package.nix b/pkgs/by-name/en/entt/package.nix index d41c37d20166..85738a164782 100644 --- a/pkgs/by-name/en/entt/package.nix +++ b/pkgs/by-name/en/entt/package.nix @@ -6,13 +6,13 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "entt"; - version = "3.16.0"; + version = "4.0.0"; src = fetchFromGitHub { owner = "skypjack"; repo = "entt"; rev = "v${finalAttrs.version}"; - hash = "sha256-i4K7NigYPYAOsVLhtjQJFmm9LoWiTg39F8SIBRuv4Vg="; + hash = "sha256-+sIe2zn2uY/BHB+KIuJ5+1fa8qDjDnsnLBWk14WuUT0="; }; nativeBuildInputs = [ cmake ]; diff --git a/pkgs/by-name/fi/firestarter/package.nix b/pkgs/by-name/fi/firestarter/package.nix index 4ee154b6c3a2..4e74e4395095 100644 --- a/pkgs/by-name/fi/firestarter/package.nix +++ b/pkgs/by-name/fi/firestarter/package.nix @@ -9,20 +9,24 @@ glibc, git, pkg-config, - cudaPackages ? { }, - withCuda ? false, + installShellFiles, + config, + cudaPackages, + versionCheckHook, + withCuda ? config.cudaSupport, }: let - inherit (cudaPackages) cudatoolkit; - - hwloc = stdenv.mkDerivation rec { + hwloc = stdenv.mkDerivation (finalAttrs: { pname = "hwloc"; version = "2.2.0"; + strictDeps = true; + __structuredAttrs = true; + src = fetchzip { - url = "https://download.open-mpi.org/release/hwloc/v${lib.versions.majorMinor version}/hwloc-${version}.tar.gz"; - sha256 = "1ibw14h9ppg8z3mmkwys8vp699n85kymdz20smjd2iq9b67y80b6"; + url = "https://download.open-mpi.org/release/hwloc/v${lib.versions.majorMinor finalAttrs.version}/hwloc-${finalAttrs.version}.tar.gz"; + hash = "sha256-ZgHkj1kJR9Fk1UD8Vv0syKZk7kba81nr+OjdmyAJfMU="; }; configureFlags = [ @@ -54,35 +58,50 @@ let "doc" "man" ]; - }; + }); in -stdenv.mkDerivation rec { +stdenv.mkDerivation (finalAttrs: { pname = "firestarter"; version = "2.0"; + strictDeps = true; + __structuredAttrs = true; + src = fetchFromGitHub { owner = "tud-zih-energy"; repo = "FIRESTARTER"; - tag = "v${version}"; - sha256 = "1ik6j1lw5nldj4i3lllrywqg54m9i2vxkxsb2zr4q0d2rfywhn23"; + tag = "v${finalAttrs.version}"; fetchSubmodules = true; + hash = "sha256-Q1jIvcuiAUzyF0v32beIqZLyMPeZUjoikY3awmmQZsY="; }; postPatch = '' + substituteInPlace CMakeLists.txt \ + --replace-fail \ + 'set(_FIRESTARTER_VERSION_STRING "unknown")' \ + 'set(_FIRESTARTER_VERSION_STRING "v${finalAttrs.version}")' + substituteInPlace lib/nitro/CMakeLists.txt \ - --replace-fail 'cmake_minimum_required(VERSION 3.2)' 'cmake_minimum_required(VERSION 3.10)' + --replace-fail \ + 'cmake_minimum_required(VERSION 3.2)' \ + 'cmake_minimum_required(VERSION 3.10)' + substituteInPlace lib/json/CMakeLists.txt \ - --replace-fail 'cmake_minimum_required(VERSION 3.1)' 'cmake_minimum_required(VERSION 3.10)' + --replace-fail \ + 'cmake_minimum_required(VERSION 3.1)' \ + 'cmake_minimum_required(VERSION 3.10)' ''; nativeBuildInputs = [ cmake git pkg-config + installShellFiles ] ++ lib.optionals withCuda [ addDriverRunpath + cudaPackages.cuda_nvcc ]; buildInputs = [ @@ -92,32 +111,37 @@ stdenv.mkDerivation rec { if withCuda then [ glibc_multi - cudatoolkit + cudaPackages.cuda_nvcc # crt/host_defines.h + cudaPackages.cuda_cudart + cudaPackages.libcublas + cudaPackages.libcurand ] else [ glibc.static ] ); env = lib.optionalAttrs withCuda { - NIX_LDFLAGS = "-L${cudatoolkit}/lib/stubs"; + NIX_LDFLAGS = "-L${lib.getOutput "stubs" cudaPackages.cuda_cudart}/lib/stubs"; }; cmakeFlags = [ - "-DFIRESTARTER_BUILD_HWLOC=OFF" - "-DCMAKE_C_COMPILER_WORKS=1" - "-DCMAKE_CXX_COMPILER_WORKS=1" + (lib.cmakeBool "FIRESTARTER_BUILD_HWLOC" false) + (lib.cmakeFeature "CMAKE_C_COMPILER_WORKS" "1") + (lib.cmakeFeature "CMAKE_CXX_COMPILER_WORKS" "1") ] ++ lib.optionals withCuda [ - "-DFIRESTARTER_BUILD_TYPE=FIRESTARTER_CUDA" + (lib.cmakeFeature "FIRESTARTER_BUILD_TYPE" "FIRESTARTER_CUDA") ]; installPhase = '' runHook preInstall - mkdir -p $out/bin - cp src/FIRESTARTER${lib.optionalString withCuda "_CUDA"} $out/bin/ + installBin src/FIRESTARTER${lib.optionalString withCuda "_CUDA"} runHook postInstall ''; + doInstallCheck = !withCuda; # tries to access GPU + nativeInstallCheckInputs = [ versionCheckHook ]; + postFixup = lib.optionalString withCuda '' addDriverRunpath $out/bin/FIRESTARTER_CUDA ''; @@ -132,6 +156,6 @@ stdenv.mkDerivation rec { marenz ]; license = lib.licenses.gpl3; - mainProgram = "FIRESTARTER"; + mainProgram = "FIRESTARTER${lib.optionalString withCuda "_CUDA"}"; }; -} +}) diff --git a/pkgs/by-name/fr/free5gc-upf/package.nix b/pkgs/by-name/fr/free5gc-upf/package.nix index ffb12e735b11..4859ad84487c 100644 --- a/pkgs/by-name/fr/free5gc-upf/package.nix +++ b/pkgs/by-name/fr/free5gc-upf/package.nix @@ -7,17 +7,17 @@ }: buildGoModule (finalAttrs: { pname = "free5gc-upf"; - version = "1.2.12"; + version = "1.2.13"; __structuredAttrs = true; src = fetchFromGitHub { owner = "free5gc"; repo = "go-upf"; tag = "v${finalAttrs.version}"; - hash = "sha256-MfQbHVEqnoFzUL5FPIE6dQSJxQD7PAZSbAgy/skHs+8="; + hash = "sha256-KWJCESbgfggAWMI76U2EhSjvwF+nHwI+ItEo9nPRVzU="; }; - vendorHash = "sha256-VPm0Z67Sm/liIofVm1bI3/HU+lwYtwkg6zMRdZFZTZ8="; + vendorHash = "sha256-sdeFBWZDzkk28ycoIsVoZNUC2OH1Zv7C/1DqYdCtLyo="; ldflags = [ "-X github.com/free5gc/util/version.VERSION=v${finalAttrs.version}" diff --git a/pkgs/by-name/fr/freeipa/package.nix b/pkgs/by-name/fr/freeipa/package.nix index 145942eec5c0..50a681ef8386 100644 --- a/pkgs/by-name/fr/freeipa/package.nix +++ b/pkgs/by-name/fr/freeipa/package.nix @@ -25,7 +25,7 @@ libunistring, libverto, libpwquality, - systemd, + systemdLibs, python3Packages, bind, sssd, @@ -111,7 +111,7 @@ stdenv.mkDerivation (finalAttrs: { samba libunistring libverto - systemd + systemdLibs bind libpwquality jansson diff --git a/pkgs/by-name/gg/ggml/package.nix b/pkgs/by-name/gg/ggml/package.nix index c4fe5307a53d..9131ca861f2e 100644 --- a/pkgs/by-name/gg/ggml/package.nix +++ b/pkgs/by-name/gg/ggml/package.nix @@ -7,7 +7,7 @@ stdenv.mkDerivation (finalAttrs: { pname = "ggml"; - version = "0.24.0"; + version = "0.25.3"; __structuredAttrs = true; strictDeps = true; @@ -16,7 +16,7 @@ stdenv.mkDerivation (finalAttrs: { owner = "ggml-org"; repo = "ggml"; tag = "v${finalAttrs.version}"; - hash = "sha256-wSI0GnSFoMyBKuzIrelURzaIaSIS/eIAwG4etmy9XUo="; + hash = "sha256-u6HQNbSjuMeWsQOR7hMKJCj659KDp/Qps0KU38it54Q="; }; # The cmake package does not handle absolute CMAKE_INSTALL_LIBDIR and CMAKE_INSTALL_INCLUDEDIR diff --git a/pkgs/by-name/ha/havn/package.nix b/pkgs/by-name/ha/havn/package.nix index 2251bb0a3cbf..7ce651cd27c8 100644 --- a/pkgs/by-name/ha/havn/package.nix +++ b/pkgs/by-name/ha/havn/package.nix @@ -8,7 +8,7 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "havn"; - version = "0.3.9"; + version = "0.3.10"; __structuredAttrs = true; @@ -16,10 +16,10 @@ rustPlatform.buildRustPackage (finalAttrs: { owner = "mrjackwills"; repo = "havn"; tag = "v${finalAttrs.version}"; - hash = "sha256-G+aUTzlpUfVTkoftp1igCPeKaQpbS4CyydoitcLzxjk="; + hash = "sha256-CABTI2UilR4b0vQdWaiXJK8sRNVK1dV1d+2qckVcWSo="; }; - cargoHash = "sha256-G4DNr69FKiLI3vrEX3AMPn3DdWzPbxA7t2vw3bJtW94="; + cargoHash = "sha256-qw/+eN27SxPrg0ma3Lj04BDh/XWFPQk0f4hL5a9IzIE="; nativeInstallCheckInputs = [ versionCheckHook ]; diff --git a/pkgs/by-name/he/healthchecks/package.nix b/pkgs/by-name/he/healthchecks/package.nix index 8cf1797fc2ff..3b0b0b8342e4 100644 --- a/pkgs/by-name/he/healthchecks/package.nix +++ b/pkgs/by-name/he/healthchecks/package.nix @@ -15,14 +15,14 @@ let in py.pkgs.buildPythonApplication rec { pname = "healthchecks"; - version = "4.3"; + version = "4.4"; pyproject = false; src = fetchFromGitHub { owner = "healthchecks"; repo = "healthchecks"; tag = "v${version}"; - sha256 = "sha256-8S7hIUFSr88jNEwGM4mSQAv+EdH/ynT9MvATabmtp5s="; + sha256 = "sha256-4TG6K52sY2Cqu8K+9Gg2Zh1lL0tWQY9B+jKdDf1Vg+0="; }; propagatedBuildInputs = with py.pkgs; [ diff --git a/pkgs/by-name/hy/hydra-builder/package.nix b/pkgs/by-name/hy/hydra-builder/package.nix new file mode 100644 index 000000000000..5a49a63a6ad8 --- /dev/null +++ b/pkgs/by-name/hy/hydra-builder/package.nix @@ -0,0 +1,51 @@ +{ + lib, + rustPlatform, + hydra, + pkg-config, + protobuf, + rust-jemalloc-sys, + withOtel ? false, +}: +rustPlatform.buildRustPackage (finalAttrs: { + pname = "hydra-builder"; + inherit (hydra) version src; + __structuredAttrs = true; + + cargoHash = "sha256-ULaL4B00O0ApZbBkv7GtLZWAoJI/ZNFPr+0FWsNp3OE="; + + cargoBuildFlags = [ + "--package" + "hydra-builder" + ]; + + buildFeatures = lib.optional withOtel "otel"; + + nativeBuildInputs = [ + pkg-config + protobuf + ]; + + buildInputs = [ + protobuf + rust-jemalloc-sys + ]; + + # The unit tests spin up a PostgreSQL instance, which is not available in the + # sandbox. + doCheck = false; + + meta = { + description = "Build agent for the Nix-based continuous build system Hydra"; + homepage = "https://github.com/NixOS/hydra"; + license = lib.licenses.gpl3Only; + mainProgram = "hydra-builder"; + maintainers = with lib.maintainers; [ + conni2461 + das_j + helsinki-Jo + mindavi + ]; + platforms = lib.platforms.unix; + }; +}) diff --git a/pkgs/by-name/hy/hydra-evaluator/package.nix b/pkgs/by-name/hy/hydra-evaluator/package.nix new file mode 100644 index 000000000000..71d1d13e1c58 --- /dev/null +++ b/pkgs/by-name/hy/hydra-evaluator/package.nix @@ -0,0 +1,51 @@ +{ + lib, + rustPlatform, + hydra, + pkg-config, + protobuf, + rust-jemalloc-sys, + nixosTests, +}: +rustPlatform.buildRustPackage (finalAttrs: { + pname = "hydra-evaluator"; + inherit (hydra) version src; + __structuredAttrs = true; + + cargoHash = "sha256-ULaL4B00O0ApZbBkv7GtLZWAoJI/ZNFPr+0FWsNp3OE="; + + cargoBuildFlags = [ + "--package" + "hydra-evaluator" + ]; + + nativeBuildInputs = [ + pkg-config + protobuf + ]; + + buildInputs = [ + protobuf + rust-jemalloc-sys + ]; + + # The unit tests spin up a PostgreSQL instance, which is not available in the + # sandbox. + doCheck = false; + + passthru.tests = { inherit (nixosTests) hydra; }; + + meta = { + description = "Evaluator for the Nix-based continuous build system Hydra"; + homepage = "https://github.com/NixOS/hydra"; + license = lib.licenses.gpl3Only; + mainProgram = "hydra-evaluator"; + maintainers = with lib.maintainers; [ + conni2461 + das_j + helsinki-Jo + mindavi + ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/pkgs/by-name/hy/hydra-queue-runner/package.nix b/pkgs/by-name/hy/hydra-queue-runner/package.nix new file mode 100644 index 000000000000..36fb68e20acd --- /dev/null +++ b/pkgs/by-name/hy/hydra-queue-runner/package.nix @@ -0,0 +1,53 @@ +{ + lib, + rustPlatform, + hydra, + pkg-config, + protobuf, + rust-jemalloc-sys, + nixosTests, + withOtel ? false, +}: +rustPlatform.buildRustPackage (finalAttrs: { + pname = "hydra-queue-runner"; + inherit (hydra) version src; + __structuredAttrs = true; + + cargoHash = "sha256-ULaL4B00O0ApZbBkv7GtLZWAoJI/ZNFPr+0FWsNp3OE="; + + cargoBuildFlags = [ + "--package" + "hydra-queue-runner" + ]; + + buildFeatures = lib.optional withOtel "otel"; + + nativeBuildInputs = [ + pkg-config + protobuf + ]; + + buildInputs = [ + protobuf + rust-jemalloc-sys + ]; + + # The unit tests spin up a PostgreSQL instance, which is not available in the sandbox. + doCheck = false; + + passthru.tests = { inherit (nixosTests) hydra; }; + + meta = { + description = "Queue runner for the Nix-based continuous build system Hydra"; + homepage = "https://github.com/NixOS/hydra"; + license = lib.licenses.gpl3Only; + mainProgram = "hydra-queue-runner"; + maintainers = with lib.maintainers; [ + conni2461 + das_j + helsinki-Jo + mindavi + ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/pkgs/by-name/hy/hydra-ws/package.nix b/pkgs/by-name/hy/hydra-ws/package.nix new file mode 100644 index 000000000000..ac09d264f660 --- /dev/null +++ b/pkgs/by-name/hy/hydra-ws/package.nix @@ -0,0 +1,51 @@ +{ + lib, + hydra, + rustPlatform, + pkg-config, + protobuf, + rust-jemalloc-sys, + nixosTests, +}: +rustPlatform.buildRustPackage (finalAttrs: { + pname = "hydra-ws"; + inherit (hydra) version src; + __structuredAttrs = true; + + cargoHash = "sha256-ULaL4B00O0ApZbBkv7GtLZWAoJI/ZNFPr+0FWsNp3OE="; + + cargoBuildFlags = [ + "--package" + "hydra-ws" + ]; + + nativeBuildInputs = [ + pkg-config + protobuf + ]; + + buildInputs = [ + protobuf + rust-jemalloc-sys + ]; + + # The unit tests spin up a PostgreSQL instance, which is not available in the + # sandbox. + doCheck = false; + + passthru.tests = { inherit (nixosTests) hydra; }; + + meta = { + description = "WebSocket server streaming build logs for the Hydra web interface"; + homepage = "https://github.com/NixOS/hydra"; + license = lib.licenses.gpl3Only; + mainProgram = "hydra-ws"; + maintainers = with lib.maintainers; [ + conni2461 + das_j + helsinki-Jo + mindavi + ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/pkgs/by-name/hy/hydra/nix-perl.nix b/pkgs/by-name/hy/hydra/nix-perl.nix new file mode 100644 index 000000000000..37260bc71c80 --- /dev/null +++ b/pkgs/by-name/hy/hydra/nix-perl.nix @@ -0,0 +1,74 @@ +# Nix's Perl bindings. They were dropped from Nix itself in 2.35 and are now +# maintained in the Hydra repository: +# https://github.com/NixOS/hydra/commit/1dd13469091cd25656cfa0db4b8a353c1a2c26e7 +{ + lib, + stdenv, + src, + meson, + ninja, + nix-store, + perl, + perlPackages, + pkg-config, +}: +perl.pkgs.toPerlModule ( + stdenv.mkDerivation (finalAttrs: { + pname = "nix-perl"; + inherit (nix-store) version; + inherit src; + + __structuredAttrs = true; + strictDeps = true; + + sourceRoot = "${finalAttrs.src.name}/subprojects/nix-perl"; + + nativeBuildInputs = [ + meson + ninja + perl + pkg-config + ]; + + buildInputs = [ + nix-store + # We compile against perl's CORE headers, which `#include ` from + # the `libxcrypt` perl propagates. + perl + perlPackages.DBDSQLite + perlPackages.DBI + ]; + + preConfigure = '' + echo ${finalAttrs.version} > .version + '' + # Upstream's `meson.build` compiles `Store.xs` against perl's `CORE` headers but without perl's + # own `ccflags`. + # Some of those (e.g. `-DNO_POSIX_2008_LOCALE` on Darwin) change the layout of + # `PerlInterpreter`, so the module then fails the XS handshake on load. + + '' + export NIX_CFLAGS_COMPILE+=" $(perl -MConfig -e 'print join " ", grep { /^-D/ } split " ", $Config{ccflags}')" + ''; + + mesonBuildType = "release"; + + mesonFlags = [ + (lib.mesonEnable "tests" finalAttrs.finalPackage.doCheck) + ]; + + mesonCheckFlags = [ "--print-errorlogs" ]; + + doCheck = true; + + nativeCheckInputs = [ + perlPackages.Test2Harness + ]; + + meta = { + description = "Perl bindings for the Nix store, as maintained in the Hydra repository"; + homepage = "https://github.com/NixOS/hydra"; + license = lib.licenses.lgpl21Plus; + platforms = lib.platforms.unix; + }; + }) +) diff --git a/pkgs/by-name/hy/hydra/package.nix b/pkgs/by-name/hy/hydra/package.nix index 6574c94923b3..ce297c9b7ea1 100644 --- a/pkgs/by-name/hy/hydra/package.nix +++ b/pkgs/by-name/hy/hydra/package.nix @@ -1,77 +1,72 @@ { stdenv, lib, + callPackage, + fetchFromGitHub, nixVersions, + nix-eval-jobs, + nixosTests, perlPackages, buildEnv, + unstableGitUpdater, + makeWrapper, - unzip, - pkg-config, - libpqxx, - top-git, - mercurial, - darcs, - subversion, - breezy, - openssl, - bzip2, - libxslt, - perl, - postgresql, - prometheus-cpp, - nukeReferences, - git, - nlohmann_json, - openssh, - openldap, - gnused, - coreutils, - findutils, - gzip, - xz, - gnutar, - rpm, - dpkg, - cdrkit, - pixz, - boost, mdbook, - foreman, - python3, - netcat, - cacert, - glibcLocales, meson, ninja, - nix-eval-jobs, - fetchFromGitHub, - nixosTests, - unstableGitUpdater, + nukeReferences, + unzip, + + bzip2, + perl, + pixz, + + coreutils, + findutils, + gnused, + gnutar, + gzip, + openssh, + xz, + + breezy, + darcs, + gitMinimal, + mercurial, + subversion, + top-git, + + cdrkit, + dpkg, + rpm, }: let - # Need these pins until we bump past https://github.com/NixOS/hydra/pull/1828 - nix = nixVersions.nix_2_34; - nixEvalJobsVersion = "2.34.3"; - nix-eval-jobs_2_34 = - (nix-eval-jobs.override { - nixComponents = nixVersions.nixComponents_2_34; - }).overrideAttrs - { - version = nixEvalJobsVersion; - src = fetchFromGitHub { - owner = "NixOS"; - repo = "nix-eval-jobs"; - tag = "v${nixEvalJobsVersion}"; - hash = "sha256-YaVQAgBxWbUBFHXLBLzdUyVvuA/DDw80SEnn9iq0Veo="; - }; - }; + # Keep in sync with the nix input of https://github.com/NixOS/hydra/blob/master/flake.nix + nixComponents = nixVersions.nixComponents_2_35; + + version = "0-unstable-2026-09-09"; + + src = fetchFromGitHub { + owner = "NixOS"; + repo = "hydra"; + rev = "1d1d8b1c6fdc08444a514f383b291228f19d72d8"; + hash = "sha256-wbPw1mlCrZODGxWFSXkOjCtKRWYeZYcs/W24yay3tKM="; + }; + + nix-perl = callPackage ./nix-perl.nix { + inherit src; + inherit (nixComponents) nix-store; + }; perlDeps = buildEnv { name = "hydra-perl-deps"; - paths = - with perlPackages; - lib.closePropagation [ + paths = lib.closePropagation ( + [ + gitMinimal + nix-perl + ] + ++ (with perlPackages; [ AuthenSASL CatalystActionREST CatalystAuthenticationStoreDBIxClass @@ -84,21 +79,20 @@ let CatalystPluginSessionStateCookie CatalystPluginSessionStoreFastMmap CatalystPluginStackTrace - CatalystRuntime CatalystTraitForRequestProxyBase CatalystViewDownload CatalystViewJSON CatalystViewTT - CatalystXScriptServerStarman CatalystXRoleApplicator + CatalystXScriptServerStarman CryptPassphrase CryptPassphraseArgon2 CryptRandPasswd + DataDump + DateTime DBDPg DBDSQLite DBIxClassHelpers - DataDump - DateTime DigestSHA1 EmailMIME EmailSender @@ -122,11 +116,10 @@ let NumberBytesHuman PadWalker ParallelForkManager - PerlCriticCommunity PrometheusTinyShared ReadonlyX - SQLSplitStatement SetScalar + SQLSplitStatement Starman StringCompareConstantTime SysHostnameLong @@ -136,140 +129,109 @@ let TestPostgreSQL TextDiff TextTable - UUID4Tiny + URIdb + UUIDURandom XMLSimple YAML - (nix.libs.nix-perl-bindings or nix.perl-bindings or null) - git - ]; + ]) + ); }; - in stdenv.mkDerivation (finalAttrs: { pname = "hydra"; - version = "0-unstable-2026-03-16"; + inherit version src; # nixpkgs-update: no auto update - src = fetchFromGitHub { - owner = "NixOS"; - repo = "hydra"; - rev = "a40d42862da88cce78a27dd594e1484a034aac4d"; - hash = "sha256-8pttLK/JQiUL6EXJfjBtBggiLw+769JdQGrpM7klXdg="; - }; + sourceRoot = "${finalAttrs.src.name}/subprojects/hydra"; outputs = [ "out" "doc" ]; - buildInputs = [ - unzip - libpqxx - top-git - mercurial - darcs - subversion - breezy - openssl - bzip2 - libxslt - nix - perlDeps + strictDeps = true; + __structuredAttrs = true; + + nativeBuildInputs = [ + makeWrapper + mdbook + meson + ninja + nukeReferences perl - pixz - boost - nlohmann_json - prometheus-cpp + perlDeps + unzip + ]; + + buildInputs = [ + perl + perlDeps ]; hydraPath = lib.makeBinPath ( [ - subversion - openssh - nix - nix-eval-jobs_2_34 - coreutils - findutils - pixz - gzip - bzip2 - xz - gnutar - unzip - git - top-git - mercurial - darcs - gnused breezy + bzip2 + coreutils + darcs + findutils + gitMinimal + gnused + gnutar + gzip + mercurial + nix-eval-jobs + nixComponents.nix-cli + openssh + pixz + subversion + top-git + unzip + xz ] ++ lib.optionals stdenv.hostPlatform.isLinux [ - rpm - dpkg cdrkit + dpkg + rpm ] ); - nativeBuildInputs = [ - meson - ninja - makeWrapper - pkg-config - mdbook - nukeReferences - ]; - - nativeCheckInputs = [ - cacert - foreman - glibcLocales - python3 - netcat - nix-eval-jobs_2_34 - openldap - postgresql - ]; - - env = { - OPENLDAP_ROOT = openldap; - }; - - shellHook = '' - PATH=$(pwd)/src/script:$(pwd)/src/hydra-queue-runner:$(pwd)/src/hydra-evaluator:$PATH - PERL5LIB=$(pwd)/src/lib:$PERL5LIB; - ''; - mesonBuildType = "release"; postPatch = '' patchShebangs . ''; - preCheck = '' - export LOGNAME=''${LOGNAME:-foo} - # set $HOME for bzr so it can create its trace file - export HOME=$(mktemp -d) + # Tests live in subprojects/hydra-tests and need PostgreSQL plus the Rust + # daemons. Covered by nixosTests.hydra instead. + doCheck = false; + + # subprojects/hydra-manual is a separate meson project upstream. + postBuild = '' + mdbook build ../../hydra-manual -d "$NIX_BUILD_TOP/manual" ''; postInstall = '' - mkdir -p $out/nix-support + mkdir -p $doc/share/doc/hydra $out/nix-support + cp -r $NIX_BUILD_TOP/manual/. $doc/share/doc/hydra + echo "doc manual $doc/share/doc/hydra" >> $out/nix-support/hydra-build-products + for i in $out/bin/*; do read -n 4 chars < $i if [[ $chars =~ ELF ]]; then continue; fi wrapProgram $i \ --prefix PERL5LIB ':' "$out/libexec/hydra/lib:${perlPackages.makePerlPath [ perlDeps ]}" \ - --prefix PATH ':' $out/bin:$hydraPath \ + --prefix PATH ':' "$out/bin:$hydraPath" \ --set-default HYDRA_RELEASE ${finalAttrs.version} \ --set HYDRA_HOME $out/libexec/hydra \ - --set NIX_RELEASE ${nix.name or "unknown"} \ - --set NIX_EVAL_JOBS_RELEASE ${nix-eval-jobs_2_34.name or "unknown"} + --set NIX_RELEASE ${nixComponents.nix-cli.name or "unknown"} \ + --set NIX_EVAL_JOBS_RELEASE ${nix-eval-jobs.name or "unknown"} done ''; - doCheck = true; - passthru = { - inherit nix perlDeps; + inherit nix-perl perlDeps; + nix = nixComponents.nix-cli; tests = { inherit (nixosTests) hydra; }; updateScript = unstableGitUpdater { }; }; @@ -277,7 +239,7 @@ stdenv.mkDerivation (finalAttrs: { meta = { description = "Nix-based continuous build system"; homepage = "https://nixos.org/hydra"; - license = lib.licenses.gpl3; + license = lib.licenses.gpl3Only; platforms = lib.platforms.linux; maintainers = with lib.maintainers; [ conni2461 diff --git a/pkgs/by-name/jo/journaldriver/package.nix b/pkgs/by-name/jo/journaldriver/package.nix index 1f6456840ced..c49f48ceeb4b 100644 --- a/pkgs/by-name/jo/journaldriver/package.nix +++ b/pkgs/by-name/jo/journaldriver/package.nix @@ -4,7 +4,7 @@ rustPlatform, pkg-config, openssl, - systemd, + systemdLibs, }: rustPlatform.buildRustPackage { @@ -24,7 +24,7 @@ rustPlatform.buildRustPackage { buildInputs = [ openssl - systemd + systemdLibs ]; nativeBuildInputs = [ pkg-config ]; diff --git a/pkgs/by-name/jo/joypixels/package.nix b/pkgs/by-name/jo/joypixels/package.nix index 00229fc6b659..4630cbb39ff7 100644 --- a/pkgs/by-name/jo/joypixels/package.nix +++ b/pkgs/by-name/jo/joypixels/package.nix @@ -14,7 +14,7 @@ let darwin = rec { systemTag = "nix-darwin"; capitalized = systemTag; - fontFile = "JoyPixels-SBIX.ttf"; + fontFile = "joypixels-sbix.ttf"; }; } .${kernel.name} or { @@ -23,20 +23,31 @@ let fontFile = "joypixels-android.ttf"; }; - joypixels-free-license = lib.licenses.mkLicense { - shortName = "JoyPixels-Free"; - fullName = "JoyPixels Free License Agreement"; - url = "https://cdn.joypixels.com/free-license.pdf"; - free = false; - }; + joypixels-free-license = + let + inherit (systemSpecific) systemTag; + in + lib.licenses.mkLicense { + shortName = "JoyPixels-Free"; + fullName = "JoyPixels Free License Agreement"; + url = "https://cdn.joypixels.com/distributions/${systemTag}/license/free-license.txt"; + free = false; + }; - joypixels-license-appendix = lib.licenses.mkLicense { - shortName = "JoyPixels-NixOS-Appendix"; - fullName = "JoyPixels ${systemSpecific.capitalized} License Appendix"; - url = "https://cdn.joypixels.com/distributions/${systemSpecific.systemTag}/appendix/joypixels-license-appendix.pdf"; - free = false; - redistributable = true; - }; + joypixels-license-appendix = + let + inherit (systemSpecific) + capitalized + systemTag + ; + in + lib.licenses.mkLicense { + shortName = "JoyPixels-NixOS-Appendix"; + fullName = "JoyPixels ${capitalized} License Appendix"; + url = "https://cdn.joypixels.com/distributions/${systemTag}/appendix/joypixels-license-appendix.txt"; + free = false; + redistributable = true; + }; throwLicense = throw '' Use of the JoyPixels font requires acceptance of the license. @@ -67,7 +78,7 @@ in stdenv.mkDerivation rec { pname = "joypixels"; - version = "9.0.0"; + version = "11.0.0"; src = assert !acceptLicense -> throwLicense; @@ -77,9 +88,9 @@ stdenv.mkDerivation rec { url = "https://cdn.joypixels.com/distributions/${systemTag}/font/${version}/${fontFile}"; sha256 = { - darwin = "sha256-muUxXzz8BePyPsiZocYvM0ebM1H+u84ysN5YUvsMLiU="; + darwin = "sha256-NDxhHgnHDenHict39V4W8mLJIqpmBfmDYfsRx7Es06s="; } - .${kernel.name} or "sha256-pmGsVgYSK/c5OlhOXhNlRBs/XppMXmsHcZeSmIkuED4="; + .${kernel.name} or "sha256-taHKy2rin1SE24BKnB8LZ662U8MO9HL5if3+mHQ38Io="; }; dontUnpack = true; @@ -95,10 +106,7 @@ stdenv.mkDerivation rec { meta = { description = "Finest emoji you can use legally (formerly EmojiOne)"; longDescription = '' - Updated for 2024! JoyPixels 9.0 includes 3,820 originally crafted icon - designs and is 100% Unicode 15.1 compatible. We offer the largest - selection of files ranging from png, svg, iconjar, and fonts (sprites - available upon request). + Updated for 2026! 3,991 originally-crafted emoji, Unicode 17 compatible. ''; homepage = "https://www.joypixels.com/fonts"; hydraPlatforms = [ ]; # Just a binary file download, nothing to cache. diff --git a/pkgs/by-name/ki/kitty/package.nix b/pkgs/by-name/ki/kitty/package.nix index 8ca230f8da12..a31cd2c94d9f 100644 --- a/pkgs/by-name/ki/kitty/package.nix +++ b/pkgs/by-name/ki/kitty/package.nix @@ -151,6 +151,15 @@ buildPythonApplication rec { }) ]; + postPatch = lib.optionalString stdenv.hostPlatform.isLinux '' + substituteInPlace glfw/x11_init.c \ + --replace-fail 'libXi.so.6' '${lib.getLib libxi}/lib/libXi.so.6' \ + --replace-fail 'libXrandr.so.2' '${lib.getLib libxrandr}/lib/libXrandr.so.2' \ + --replace-fail 'libXcursor.so.1' '${lib.getLib libxcursor}/lib/libXcursor.so.1' \ + --replace-fail 'libXinerama.so.1' '${lib.getLib libxinerama}/lib/libXinerama.so.1' \ + --replace-fail 'libXext.so.6' '${lib.getLib libxext}/lib/libXext.so.6' + ''; + hardeningDisable = [ # causes redefinition of _FORTIFY_SOURCE "fortify3" diff --git a/pkgs/by-name/kn/knxd/package.nix b/pkgs/by-name/kn/knxd/package.nix index a1ea965e4622..0cf316ab686d 100644 --- a/pkgs/by-name/kn/knxd/package.nix +++ b/pkgs/by-name/kn/knxd/package.nix @@ -10,8 +10,8 @@ argp-standalone, fmt, libev, - withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, - systemd, + withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemdLibs, + systemdLibs, withUsb ? stdenv.hostPlatform.isLinux, libusb1, }: @@ -43,7 +43,7 @@ stdenv.mkDerivation (finalAttrs: { fmt libev ] - ++ lib.optional withSystemd systemd + ++ lib.optional withSystemd systemdLibs ++ lib.optional withUsb libusb1 ++ lib.optional stdenv.hostPlatform.isDarwin argp-standalone; diff --git a/pkgs/by-name/kt/ktls-utils/package.nix b/pkgs/by-name/kt/ktls-utils/package.nix index 5c8a02a09236..285b596d6245 100644 --- a/pkgs/by-name/kt/ktls-utils/package.nix +++ b/pkgs/by-name/kt/ktls-utils/package.nix @@ -8,8 +8,8 @@ keyutils, glib, libnl, - systemd, - withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, + systemdLibs, + withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemdLibs, nix-update-script, nixosTests, }: diff --git a/pkgs/by-name/li/libwmf/package.nix b/pkgs/by-name/li/libwmf/package.nix index 4ca132dbddaf..1eb29a798197 100644 --- a/pkgs/by-name/li/libwmf/package.nix +++ b/pkgs/by-name/li/libwmf/package.nix @@ -16,7 +16,7 @@ stdenv.mkDerivation (finalAttrs: { pname = "libwmf"; - version = "0.2.15"; + version = "0.2.16"; outputs = [ "out" @@ -27,7 +27,7 @@ stdenv.mkDerivation (finalAttrs: { owner = "caolanm"; repo = "libwmf"; tag = "v${finalAttrs.version}"; - hash = "sha256-Bpxr04dQ6EjX1FBVF4KcbJQvUjsPK6L03xLIXG6F2FI="; + hash = "sha256-cQY0DFG+S35G7vblbBxWMTWFp8WqnpNSvjohQSLzijU="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/li/lightgbm/package.nix b/pkgs/by-name/li/lightgbm/package.nix index 674ac37cd563..3e3da206aab8 100644 --- a/pkgs/by-name/li/lightgbm/package.nix +++ b/pkgs/by-name/li/lightgbm/package.nix @@ -49,6 +49,9 @@ stdenv.mkDerivation (finalAttrs: { pname = lib.optionalString rLibrary "r-" + "lightgbm"; version = "4.6.0"; + strictDeps = true; + __structuredAttrs = true; + src = fetchFromGitHub { owner = "lightgbm-org"; repo = "lightgbm"; @@ -95,6 +98,7 @@ stdenv.mkDerivation (finalAttrs: { nativeBuildInputs = [ cmake ] + ++ lib.optionals cudaSupport [ cudaPackages.cuda_nvcc ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ llvmPackages.openmp ] ++ lib.optionals openclSupport [ opencl-headers @@ -110,7 +114,7 @@ stdenv.mkDerivation (finalAttrs: { pandoc ]; - buildInputs = [ gtest ] ++ lib.optional cudaSupport cudaPackages.cudatoolkit; + buildInputs = [ gtest ] ++ lib.optionals cudaSupport [ cudaPackages.cuda_cudart ]; propagatedBuildInputs = lib.optionals rLibrary [ rPackages.data_table @@ -128,6 +132,9 @@ stdenv.mkDerivation (finalAttrs: { ++ lib.optionals cudaSupport [ (lib.cmakeBool "USE_CUDA" true) (lib.cmakeFeature "CMAKE_CXX_COMPILER" (lib.getExe cudaPackages.backendStdenv.cc)) + (lib.cmakeFeature "CMAKE_CUDA_STANDARD" "14") + (lib.cmakeFeature "CMAKE_CUDA_ARCHITECTURES" cudaPackages.flags.cmakeCudaArchitecturesString) + (lib.cmakeBool "CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS" true) ] ++ lib.optionals openclSupport [ (lib.cmakeBool "USE_GPU" true) diff --git a/pkgs/by-name/mi/mint-l-icons/package.nix b/pkgs/by-name/mi/mint-l-icons/package.nix index f743c92c4bb4..64858409ae99 100644 --- a/pkgs/by-name/mi/mint-l-icons/package.nix +++ b/pkgs/by-name/mi/mint-l-icons/package.nix @@ -9,14 +9,14 @@ stdenvNoCC.mkDerivation { pname = "mint-l-icons"; - version = "1.8.3"; + version = "1.8.4"; src = fetchFromGitHub { owner = "linuxmint"; repo = "mint-l-icons"; # They don't really do tags, this is just a named commit. - rev = "ddb43425b35aaf15a8d5ba74059b5b72c2a383e2"; - hash = "sha256-Vfhlor9RZpDc7zLs90hRreZco3uR/OmoH3QQvMg0kVk="; + rev = "0b22e7cc69f11e8472065cfc9309add51f403cfc"; + hash = "sha256-AtCQMgSmeMV7rU6XaT42bD4DDfe5acVIxQ1JwKYQb8c="; }; propagatedBuildInputs = [ diff --git a/pkgs/by-name/mo/models-dev/package.nix b/pkgs/by-name/mo/models-dev/package.nix index 14674bc91f38..abc25b097da8 100644 --- a/pkgs/by-name/mo/models-dev/package.nix +++ b/pkgs/by-name/mo/models-dev/package.nix @@ -60,7 +60,7 @@ let in stdenvNoCC.mkDerivation (finalAttrs: { pname = "models-dev"; - version = "sdk-v0.0.5-unstable-2026-10-02"; + version = "0.0.5-unstable-2026-10-02"; __structuredAttrs = true; strictDeps = true; diff --git a/pkgs/by-name/mo/mommy/package.nix b/pkgs/by-name/mo/mommy/package.nix index 515207c75602..ddcb3be18d0c 100644 --- a/pkgs/by-name/mo/mommy/package.nix +++ b/pkgs/by-name/mo/mommy/package.nix @@ -23,13 +23,13 @@ let in stdenv.mkDerivation (finalAttrs: { pname = "mommy"; - version = "1.8.0"; + version = "2.0.0"; src = fetchFromGitHub { owner = "FWDekker"; repo = "mommy"; tag = "v${finalAttrs.version}"; - hash = "sha256-zuFiRzM3mDt5GIaRl9nCLH3YteJfKtV2R29JwIKygjY="; + hash = "sha256-BMIvKaFQvtZisM3tesyO+0Yhs7g81LaFMLSZRkAP0+g="; }; nativeBuildInputs = [ makeWrapper ]; diff --git a/pkgs/by-name/mo/mosquitto/package.nix b/pkgs/by-name/mo/mosquitto/package.nix index 56621743f089..7a570c24fba0 100644 --- a/pkgs/by-name/mo/mosquitto/package.nix +++ b/pkgs/by-name/mo/mosquitto/package.nix @@ -12,9 +12,9 @@ libuv, libwebsockets, openssl, - withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, + withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemdLibs, sqlite, - systemd, + systemdLibs, uthash, nixosTests, }: @@ -77,7 +77,7 @@ stdenv.mkDerivation (finalAttrs: { sqlite uthash ] - ++ lib.optional withSystemd systemd; + ++ lib.optional withSystemd systemdLibs; propagatedBuildInputs = [ cjson ]; diff --git a/pkgs/by-name/mp/mpd-notification/package.nix b/pkgs/by-name/mp/mpd-notification/package.nix index 939d9bf99f21..8c7d75b14c08 100644 --- a/pkgs/by-name/mp/mpd-notification/package.nix +++ b/pkgs/by-name/mp/mpd-notification/package.nix @@ -9,7 +9,7 @@ libnotify, libmpdclient, discount, - systemd, + systemdLibs, }: stdenv.mkDerivation (finalAttrs: { @@ -34,7 +34,7 @@ stdenv.mkDerivation (finalAttrs: { ffmpeg libmpdclient discount - systemd + systemdLibs ]; installPhase = '' diff --git a/pkgs/by-name/mp/mpd/package.nix b/pkgs/by-name/mp/mpd/package.nix index c53585681d61..b9a22a51fe53 100644 --- a/pkgs/by-name/mp/mpd/package.nix +++ b/pkgs/by-name/mp/mpd/package.nix @@ -6,7 +6,7 @@ ninja, pkg-config, glib, - systemd, + systemdLibs, fmt, buildPackages, # Inputs @@ -140,7 +140,7 @@ let pcre = [ pcre2 ]; sqlite = [ sqlite ]; syslog = [ ]; - systemd = [ systemd ]; + systemd = [ systemdLibs ]; zeroconf = [ avahi dbus diff --git a/pkgs/by-name/mp/mpdscribble/package.nix b/pkgs/by-name/mp/mpdscribble/package.nix index 1ec0d24c72d7..8d021cc4fe6a 100644 --- a/pkgs/by-name/mp/mpdscribble/package.nix +++ b/pkgs/by-name/mp/mpdscribble/package.nix @@ -9,7 +9,7 @@ curl, libgcrypt, libmpdclient, - systemd, + systemdLibs, }: stdenv.mkDerivation (finalAttrs: { @@ -41,7 +41,7 @@ stdenv.mkDerivation (finalAttrs: { boost libgcrypt ] - ++ lib.optional stdenv.hostPlatform.isLinux systemd; + ++ lib.optional stdenv.hostPlatform.isLinux systemdLibs; meta = { description = "MPD client which submits info about tracks being played to a scrobbler"; diff --git a/pkgs/by-name/mu/multimon-ng/package.nix b/pkgs/by-name/mu/multimon-ng/package.nix index aa2e38c70a17..128c5e1977eb 100644 --- a/pkgs/by-name/mu/multimon-ng/package.nix +++ b/pkgs/by-name/mu/multimon-ng/package.nix @@ -11,13 +11,13 @@ stdenv.mkDerivation (finalAttrs: { pname = "multimon-ng"; - version = "1.6.1"; + version = "1.6.2"; src = fetchFromGitHub { owner = "EliasOenal"; repo = "multimon-ng"; rev = finalAttrs.version; - sha256 = "sha256-FxX01+bFcca+wvnilOV4xJx1bSV9lxy83EhpwWhi/Cs="; + sha256 = "sha256-OHl9y1Pk/8N4IwKYuiikHoW2sfLWU4G4uyozxHxB0WY="; }; buildInputs = lib.optionals stdenv.hostPlatform.isLinux [ diff --git a/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_main.py b/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_main.py index c8f70d9cf1e1..91c3bf93c729 100644 --- a/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_main.py +++ b/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_main.py @@ -236,89 +236,86 @@ def test_execute_nix_boot(mock_run: Mock, tmp_path: Path) -> None: nr.execute(["nixos-rebuild", "boot", "--no-flake", "-vvv", "--no-reexec"]) - assert mock_run.call_count == 9 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - capture_output=True, - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - ["nix-instantiate", "--find-file", "nixpkgs", "-vvv"], - capture_output=True, - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - ["git", "-C", nixpkgs_path, "rev-parse", "--short", "HEAD"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - ["git", "-C", nixpkgs_path, "diff", "--quiet"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-build", - "", - "--attr", - "config.system.build.toplevel", - "--no-out-link", - "-vvv", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-env", - "-p", - Path("/nix/var/nix/profiles/system"), - "--set", - config_path, - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - ["test", "-d", "/run/systemd/system"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - ["systemd-run", "--version"], - check=True, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, - "--wait", - "--verbose", - "--output=cat", - config_path / "bin/switch-to-configuration", - "boot", - ], - check=True, - stdout=ANY, - **( - DEFAULT_RUN_KWARGS - | { - "env": { - "NIXOS_INSTALL_BOOTLOADER": "0", - } + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + capture_output=True, + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + ["nix-instantiate", "--find-file", "nixpkgs", "-vvv"], + capture_output=True, + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + ["git", "-C", nixpkgs_path, "rev-parse", "--short", "HEAD"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + ["git", "-C", nixpkgs_path, "diff", "--quiet"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-build", + "", + "--attr", + "config.system.build.toplevel", + "--no-out-link", + "-vvv", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-env", + "-p", + Path("/nix/var/nix/profiles/system"), + "--set", + config_path, + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + ["test", "-d", "/run/systemd/system"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + ["systemd-run", "--version"], + check=True, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, + "--wait", + "--verbose", + "--output=cat", + config_path / "bin/switch-to-configuration", + "boot", + ], + check=True, + stdout=ANY, + **( + DEFAULT_RUN_KWARGS + | { + "env": { + "NIXOS_INSTALL_BOOTLOADER": "0", } - ), + } ), - ] - ) + ), + ] # https://github.com/NixOS/nixpkgs/issues/437872 @@ -343,31 +340,28 @@ def test_execute_nix_build(mock_run: Mock, tmp_path: Path) -> None: ] ) - assert mock_run.call_count == 2 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "build", - "--print-out-paths", - '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel', - "--no-link", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "build", + "--print-out-paths", + '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel', + "--no-link", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict(os.environ, {}, clear=True) @@ -399,32 +393,29 @@ def test_execute_nix_build_vm(mock_run: Mock, tmp_path: Path) -> None: ] ) - assert mock_run.call_count == 2 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-build", - "", - "--attr", - "config.system.build.vm", - "--include", - "nixos-config=./configuration.nix", - "--include", - "nixpkgs=$HOME/.nix-defexpr/channels/pinned_nixpkgs", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-build", + "", + "--attr", + "config.system.build.vm", + "--include", + "nixos-config=./configuration.nix", + "--include", + "nixpkgs=$HOME/.nix-defexpr/channels/pinned_nixpkgs", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict(os.environ, {}, clear=True) @@ -456,28 +447,25 @@ def test_execute_nix_build_vm_with_bootloader_and_specialisation( ] ) - assert mock_run.call_count == 2 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-build", - "", - "--attr", - "config.specialisation.custom-specialisation.configuration.system.build.vmWithBootLoader", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-build", + "", + "--attr", + "config.specialisation.custom-specialisation.configuration.system.build.vmWithBootLoader", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict(os.environ, {}, clear=True) @@ -513,58 +501,55 @@ def test_execute_nix_build_image_flake(mock_run: Mock, tmp_path: Path) -> None: ] ) - assert mock_run.call_count == 4 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "eval", - "--json", - '/path/to/config#nixosConfigurations."hostname".config.system.build.images', - "--apply", - "builtins.attrNames", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "build", - "--print-out-paths", - '/path/to/config#nixosConfigurations."hostname".config.system.build.images.azure', - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "eval", - "--json", - '/path/to/config#nixosConfigurations."hostname".config.system.build.images.azure.passthru.filePath', - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "eval", + "--json", + '/path/to/config#nixosConfigurations."hostname".config.system.build.images', + "--apply", + "builtins.attrNames", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "build", + "--print-out-paths", + '/path/to/config#nixosConfigurations."hostname".config.system.build.images.azure', + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "eval", + "--json", + '/path/to/config#nixosConfigurations."hostname".config.system.build.images.azure.passthru.filePath', + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict( @@ -606,73 +591,70 @@ def test_execute_nix_switch_flake(mock_run: Mock, tmp_path: Path) -> None: ] ) - assert mock_run.call_count == 6 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "build", - "--print-out-paths", - '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel', - "--no-link", - "-v", - "--option", - "narinfo-cache-negative-ttl", - "1200", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "sudo", - "nix-env", - "-p", - Path("/nix/var/nix/profiles/system"), - "--set", - config_path, - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - ["test", "-d", "/run/systemd/system"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - ["systemd-run", "--version"], - check=True, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "sudo", - "env", - "-i", - "NIXOS_INSTALL_BOOTLOADER=1", - *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, - "--pipe", - config_path / "bin/switch-to-configuration", - "switch", - ], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "build", + "--print-out-paths", + '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel', + "--no-link", + "-v", + "--option", + "narinfo-cache-negative-ttl", + "1200", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "sudo", + "nix-env", + "-p", + Path("/nix/var/nix/profiles/system"), + "--set", + config_path, + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + ["test", "-d", "/run/systemd/system"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + ["systemd-run", "--version"], + check=True, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "sudo", + "env", + "-i", + "NIXOS_INSTALL_BOOTLOADER=1", + *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, + "--pipe", + config_path / "bin/switch-to-configuration", + "switch", + ], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict( @@ -734,234 +716,231 @@ def test_execute_nix_switch_build_target_host_custom_profile( ] ) - assert mock_run.call_count == 14 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-instantiate", - "--find-file", - "nixpkgs", - "--include", - "nixos-config=./configuration.nix", - "--include", - "nixpkgs=$HOME/.nix-defexpr/channels/pinned_nixpkgs", - ], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-instantiate", - "", - "--attr", - "config.system.build.toplevel", - "--add-root", - nr.tmpdir.TMPDIR_PATH / "00000000000000000000000000000000", - "--include", - "nixos-config=./configuration.nix", - "--include", - "nixpkgs=$HOME/.nix-defexpr/channels/pinned_nixpkgs", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - ["nix-copy-closure", "--to", "user@build-host", config_path], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@build-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "mktemp", - "-d", - "-t", - "nixos-rebuild.XXXXX", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@build-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "nix-store", - "--realise", - str(config_path), - "--add-root", - "/tmp/tmpdir/00000000000000000000000000000000", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@build-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "readlink", - "-f", - "/tmp/tmpdir/config", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@build-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "rm", - "-rf", - "/tmp/tmpdir", - ], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "copy", - "--from", - "ssh://user@build-host", - "--to", - "ssh://user@target-host", - config_path, - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@target-host", - "--", - "sudo", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "mkdir", - "-p", - "/nix/var/nix/profiles/system-profiles", - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@target-host", - "--", - "sudo", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "nix-env", - "-p", - "/nix/var/nix/profiles/system-profiles/custom-profile", - "--set", - str(config_path), - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@target-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "test", - "-d", - "/run/systemd/system", - ], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@target-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "systemd-run", - "--version", - ], - check=True, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@target-host", - "--", - "sudo", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" LOCALE_ARCHIVE="${LOCALE_ARCHIVE-}" NIXOS_NO_CHECK="${NIXOS_NO_CHECK-}" NIXOS_INSTALL_BOOTLOADER=0 "$@"'""", - "sh", - *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, - "--pipe", - str(config_path / "bin/switch-to-configuration"), - "switch", - ], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-instantiate", + "--find-file", + "nixpkgs", + "--include", + "nixos-config=./configuration.nix", + "--include", + "nixpkgs=$HOME/.nix-defexpr/channels/pinned_nixpkgs", + ], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-instantiate", + "", + "--attr", + "config.system.build.toplevel", + "--add-root", + nr.tmpdir.TMPDIR_PATH / "00000000000000000000000000000000", + "--include", + "nixos-config=./configuration.nix", + "--include", + "nixpkgs=$HOME/.nix-defexpr/channels/pinned_nixpkgs", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + ["nix-copy-closure", "--to", "user@build-host", config_path], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@build-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "mktemp", + "-d", + "-t", + "nixos-rebuild.XXXXX", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@build-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "nix-store", + "--realise", + str(config_path), + "--add-root", + "/tmp/tmpdir/00000000000000000000000000000000", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@build-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "readlink", + "-f", + "/tmp/tmpdir/config", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@build-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "rm", + "-rf", + "/tmp/tmpdir", + ], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "copy", + "--from", + "ssh://user@build-host", + "--to", + "ssh://user@target-host", + config_path, + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@target-host", + "--", + "sudo", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "mkdir", + "-p", + "/nix/var/nix/profiles/system-profiles", + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@target-host", + "--", + "sudo", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "nix-env", + "-p", + "/nix/var/nix/profiles/system-profiles/custom-profile", + "--set", + str(config_path), + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@target-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "test", + "-d", + "/run/systemd/system", + ], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@target-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "systemd-run", + "--version", + ], + check=True, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@target-host", + "--", + "sudo", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" LOCALE_ARCHIVE="${LOCALE_ARCHIVE-}" NIXOS_NO_CHECK="${NIXOS_NO_CHECK-}" NIXOS_INSTALL_BOOTLOADER=0 "$@"'""", + "sh", + *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, + "--pipe", + str(config_path / "bin/switch-to-configuration"), + "switch", + ], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict( @@ -1004,110 +983,107 @@ def test_execute_nix_switch_flake_target_host( ] ) - assert mock_run.call_count == 7 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "build", - "--print-out-paths", - '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel', - "--no-link", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - ["nix-copy-closure", "--to", "user@localhost", config_path], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@localhost", - "--", - "sudo", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "nix-env", - "-p", - "/nix/var/nix/profiles/system", - "--set", - str(config_path), - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@localhost", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "test", - "-d", - "/run/systemd/system", - ], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@localhost", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "systemd-run", - "--version", - ], - check=True, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@localhost", - "--", - "sudo", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" LOCALE_ARCHIVE="${LOCALE_ARCHIVE-}" NIXOS_NO_CHECK="${NIXOS_NO_CHECK-}" NIXOS_INSTALL_BOOTLOADER=0 "$@"'""", - "sh", - *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, - "--pipe", - str(config_path / "bin/switch-to-configuration"), - "switch", - ], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "build", + "--print-out-paths", + '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel', + "--no-link", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + ["nix-copy-closure", "--to", "user@localhost", config_path], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@localhost", + "--", + "sudo", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "nix-env", + "-p", + "/nix/var/nix/profiles/system", + "--set", + str(config_path), + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@localhost", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "test", + "-d", + "/run/systemd/system", + ], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@localhost", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "systemd-run", + "--version", + ], + check=True, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@localhost", + "--", + "sudo", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" LOCALE_ARCHIVE="${LOCALE_ARCHIVE-}" NIXOS_NO_CHECK="${NIXOS_NO_CHECK-}" NIXOS_INSTALL_BOOTLOADER=0 "$@"'""", + "sh", + *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, + "--pipe", + str(config_path / "bin/switch-to-configuration"), + "switch", + ], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict( @@ -1151,100 +1127,97 @@ def test_execute_nix_switch_flake_build_host( ] ) - assert mock_run.call_count == 9 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "eval", - "--raw", - '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel.drvPath', - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - ["nix-copy-closure", "--to", "user@localhost", config_path], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@localhost", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "nix", - "--extra-experimental-features", - "'nix-command flakes'", - "build", - f"'{config_path}^*'", - "--print-out-paths", - "--no-link", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-copy-closure", - "--from", - "user@localhost", - config_path, - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-env", - "-p", - Path("/nix/var/nix/profiles/system"), - "--set", - config_path, - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - ["test", "-d", "/run/systemd/system"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - ["systemd-run", "--version"], - check=True, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, - "--pipe", - config_path / "bin/switch-to-configuration", - "switch", - ], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "eval", + "--raw", + '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel.drvPath', + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + ["nix-copy-closure", "--to", "user@localhost", config_path], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@localhost", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "nix", + "--extra-experimental-features", + "'nix-command flakes'", + "build", + f"'{config_path}^*'", + "--print-out-paths", + "--no-link", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-copy-closure", + "--from", + "user@localhost", + config_path, + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-env", + "-p", + Path("/nix/var/nix/profiles/system"), + "--set", + config_path, + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + ["test", "-d", "/run/systemd/system"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + ["systemd-run", "--version"], + check=True, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, + "--pipe", + config_path / "bin/switch-to-configuration", + "switch", + ], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] @patch("subprocess.run", autospec=True) @@ -1277,60 +1250,57 @@ def test_execute_switch_rollback(mock_run: Mock, tmp_path: Path) -> None: ] ) - assert mock_run.call_count == 6 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - capture_output=True, - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - ["nix-instantiate", "--find-file", "nixpkgs"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "git", - "-C", - nixpkgs_path, - "rev-parse", - "--short", - "HEAD", - ], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-env", - "--rollback", - "-p", - Path("/nix/var/nix/profiles/system"), - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - ["test", "-d", "/run/systemd/system"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - Path("/nix/var/nix/profiles/system/bin/switch-to-configuration"), - "switch", - ], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + capture_output=True, + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + ["nix-instantiate", "--find-file", "nixpkgs"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "git", + "-C", + nixpkgs_path, + "rev-parse", + "--short", + "HEAD", + ], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-env", + "--rollback", + "-p", + Path("/nix/var/nix/profiles/system"), + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + ["test", "-d", "/run/systemd/system"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + Path("/nix/var/nix/profiles/system/bin/switch-to-configuration"), + "switch", + ], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] @patch("subprocess.run", autospec=True) @@ -1346,28 +1316,25 @@ def test_execute_build(mock_run: Mock, tmp_path: Path) -> None: nr.execute(["nixos-rebuild", "build", "--no-flake", "--no-reexec"]) - assert mock_run.call_count == 2 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - capture_output=True, - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-build", - "", - "--attr", - "config.system.build.toplevel", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + capture_output=True, + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-build", + "", + "--attr", + "config.system.build.toplevel", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + ] @patch("subprocess.run", autospec=True) @@ -1397,57 +1364,54 @@ def test_execute_build_dry_run_build_and_target_remote( ] ) - assert mock_run.call_count == 4 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - capture_output=True, - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "eval", - "--raw", - '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel.drvPath', - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - ["nix-copy-closure", "--to", "user@build-host", config_path], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@build-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "nix", - "--extra-experimental-features", - "'nix-command flakes'", - "build", - f"'{config_path}^*'", - "--print-out-paths", - "--dry-run", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + capture_output=True, + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "eval", + "--raw", + '/path/to/config#nixosConfigurations."hostname".config.system.build.toplevel.drvPath', + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + ["nix-copy-closure", "--to", "user@build-host", config_path], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@build-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "nix", + "--extra-experimental-features", + "'nix-command flakes'", + "build", + f"'{config_path}^*'", + "--print-out-paths", + "--dry-run", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + ] @patch("subprocess.run", autospec=True) @@ -1469,42 +1433,39 @@ def test_execute_test_flake(mock_run: Mock, tmp_path: Path) -> None: ["nixos-rebuild", "test", "--flake", "github:user/repo#hostname", "--no-reexec"] ) - assert mock_run.call_count == 4 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - capture_output=True, - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "build", - "--print-out-paths", - 'github:user/repo#nixosConfigurations."hostname".config.system.build.toplevel', - "--no-link", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - ["test", "-d", "/run/systemd/system"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [config_path / "bin/switch-to-configuration", "test"], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + capture_output=True, + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "build", + "--print-out-paths", + 'github:user/repo#nixosConfigurations."hostname".config.system.build.toplevel', + "--no-link", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + ["test", "-d", "/run/systemd/system"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [config_path / "bin/switch-to-configuration", "test"], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] @patch("subprocess.run", autospec=True) @@ -1539,38 +1500,41 @@ def test_execute_test_rollback( ["nixos-rebuild", "test", "--rollback", "--profile-name", "foo", "--no-reexec"] ) - assert mock_run.call_count == 4 - mock_run.assert_has_calls( - [ - call( - [ - "nix-env", - "-p", - Path("/nix/var/nix/profiles/system-profiles/foo"), - "--list-generations", - ], - check=True, - stdout=PIPE, - **DEFAULT_RUN_KWARGS, - ), - call( - ["test", "-d", "/run/systemd/system"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - Path( - "/nix/var/nix/profiles/system-profiles/foo-2083-link/bin/switch-to-configuration" - ), - "test", - ], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-env", + "-p", + Path("/nix/var/nix/profiles/system-profiles/foo"), + "--list-generations", + ], + check=True, + stdout=PIPE, + **DEFAULT_RUN_KWARGS, + ), + call( + ["test", "-d", "/run/systemd/system"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + Path( + "/nix/var/nix/profiles/system-profiles/foo-2083-link/bin/switch-to-configuration" + ), + "test", + ], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] @patch.dict( @@ -1596,57 +1560,54 @@ def test_execute_switch_store_path(mock_run: Mock, tmp_path: Path) -> None: ) # --store-path skips build and write_version_suffix, so only activation calls - assert mock_run.call_count == 5 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - capture_output=True, - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "nix-env", - "-p", - Path("/nix/var/nix/profiles/system"), - "--set", - config_path, - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - ["test", "-d", "/run/systemd/system"], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - ["systemd-run", "--version"], - check=True, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, - "--pipe", - config_path / "bin/switch-to-configuration", - "switch", - ], - check=True, - stdout=ANY, - **( - DEFAULT_RUN_KWARGS - | { - "env": { - "NIXOS_INSTALL_BOOTLOADER": "0", - } + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + capture_output=True, + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "nix-env", + "-p", + Path("/nix/var/nix/profiles/system"), + "--set", + config_path, + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + ["test", "-d", "/run/systemd/system"], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + ["systemd-run", "--version"], + check=True, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, + "--pipe", + config_path / "bin/switch-to-configuration", + "switch", + ], + check=True, + stdout=ANY, + **( + DEFAULT_RUN_KWARGS + | { + "env": { + "NIXOS_INSTALL_BOOTLOADER": "0", } - ), + } ), - ] - ) + ), + ] @patch.dict(os.environ, {}, clear=True) @@ -1676,110 +1637,107 @@ def test_execute_switch_store_path_target_host( ) # --store-path skips build and write_version_suffix, so only copy/activation calls - assert mock_run.call_count == 7 - mock_run.assert_has_calls( - [ - call( - ["nix-instantiate", "--find-file", "nixos-system"], - check=False, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - ["nix-copy-closure", "--to", "user@remote-host", config_path], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@remote-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "test", - "-f", - str(config_path / "nixos-version"), - ], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@remote-host", - "--", - "sudo", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "nix-env", - "-p", - "/nix/var/nix/profiles/system", - "--set", - str(config_path), - ], - check=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@remote-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "test", - "-d", - "/run/systemd/system", - ], - check=False, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@remote-host", - "--", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", - "sh", - "systemd-run", - "--version", - ], - check=True, - capture_output=True, - **DEFAULT_RUN_KWARGS, - ), - call( - [ - "ssh", - *nr.process.SSH_DEFAULT_OPTS, - "user@remote-host", - "--", - "sudo", - "/bin/sh", - "-c", - """'exec /usr/bin/env -i PATH="${PATH-}" LOCALE_ARCHIVE="${LOCALE_ARCHIVE-}" NIXOS_NO_CHECK="${NIXOS_NO_CHECK-}" NIXOS_INSTALL_BOOTLOADER=0 "$@"'""", - "sh", - *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, - "--pipe", - str(config_path / "bin/switch-to-configuration"), - "switch", - ], - check=True, - stdout=ANY, - **DEFAULT_RUN_KWARGS, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["nix-instantiate", "--find-file", "nixos-system"], + check=False, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + ["nix-copy-closure", "--to", "user@remote-host", config_path], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@remote-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "test", + "-f", + str(config_path / "nixos-version"), + ], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@remote-host", + "--", + "sudo", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "nix-env", + "-p", + "/nix/var/nix/profiles/system", + "--set", + str(config_path), + ], + check=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@remote-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "test", + "-d", + "/run/systemd/system", + ], + check=False, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@remote-host", + "--", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" "$@"'""", + "sh", + "systemd-run", + "--version", + ], + check=True, + capture_output=True, + **DEFAULT_RUN_KWARGS, + ), + call( + [ + "ssh", + *nr.process.SSH_DEFAULT_OPTS, + "user@remote-host", + "--", + "sudo", + "/bin/sh", + "-c", + """'exec /usr/bin/env -i PATH="${PATH-}" LOCALE_ARCHIVE="${LOCALE_ARCHIVE-}" NIXOS_NO_CHECK="${NIXOS_NO_CHECK-}" NIXOS_INSTALL_BOOTLOADER=0 "$@"'""", + "sh", + *nr.nix.SWITCH_TO_CONFIGURATION_CMD_PREFIX, + "--pipe", + str(config_path / "bin/switch-to-configuration"), + "switch", + ], + check=True, + stdout=ANY, + **DEFAULT_RUN_KWARGS, + ), + ] diff --git a/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_nix.py b/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_nix.py index fb6d2fcdcb69..fcad913e1b68 100644 --- a/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_nix.py +++ b/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_nix.py @@ -116,57 +116,55 @@ def test_build_remote( copy_flags={"copy": True}, ) == Path("/path/to/config") - mock_run.assert_has_calls( - [ - call( - [ - "nix-instantiate", - "", - "--attr", - "preAttr.config.system.build.toplevel", - "--add-root", - n.tmpdir.TMPDIR_PATH / "00000000000000000000000000000001", - "--inst", - ], - stdout=PIPE, - ), - call( - [ - "nix-copy-closure", - "--copy", - "--to", - "user@host", - Path("/path/to/file"), - ], - append_local_env={ - "NIX_SSHOPTS": " ".join(["--ssh opts", *p.SSH_DEFAULT_OPTS]), - }, - ), - call( - ["mktemp", "-d", "-t", "nixos-rebuild.XXXXX"], - remote=build_host, - stdout=PIPE, - ), - call( - [ - "nix-store", - "--realise", - Path("/path/to/file"), - "--add-root", - Path("/tmp/tmpdir/00000000000000000000000000000002"), - "--realise", - ], - remote=build_host, - stdout=PIPE, - ), - call( - ["readlink", "-f", "/tmp/tmpdir/config"], - remote=build_host, - stdout=PIPE, - ), - call(["rm", "-rf", Path("/tmp/tmpdir")], remote=build_host, check=False), - ] - ) + assert mock_run.mock_calls == [ + call( + [ + "nix-instantiate", + "", + "--attr", + "preAttr.config.system.build.toplevel", + "--add-root", + n.tmpdir.TMPDIR_PATH / "00000000000000000000000000000001", + "--inst", + ], + stdout=PIPE, + ), + call( + [ + "nix-copy-closure", + "--copy", + "--to", + "user@host", + Path("/path/to/file"), + ], + append_local_env={ + "NIX_SSHOPTS": " ".join(["--ssh opts", *p.SSH_DEFAULT_OPTS]), + }, + ), + call( + ["mktemp", "-d", "-t", "nixos-rebuild.XXXXX"], + remote=build_host, + stdout=PIPE, + ), + call( + [ + "nix-store", + "--realise", + Path("/path/to/file"), + "--add-root", + Path("/tmp/tmpdir/00000000000000000000000000000002"), + "--realise", + ], + remote=build_host, + stdout=PIPE, + ), + call( + ["readlink", "-f", "/tmp/tmpdir/config"], + remote=build_host, + stdout=PIPE, + ), + call(["rm", "-rf", Path("/tmp/tmpdir")], remote=build_host, check=False), + ] @patch( @@ -192,47 +190,45 @@ def test_build_remote_flake( copy_flags={"copy": True}, flake_build_flags={"build": True}, ) == Path("/path/to/file") - mock_run.assert_has_calls( - [ - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "eval", - "--raw", - '/flake.nix#nixosConfigurations."hostname".config.system.build.toplevel.drvPath', - "--flake", - ], - stdout=PIPE, - ), - call( - [ - "nix-copy-closure", - "--copy", - "--to", - "user@host", - Path("/path/to/file"), - ], - append_local_env={ - "NIX_SSHOPTS": " ".join(["--ssh opts", *p.SSH_DEFAULT_OPTS]), - }, - ), - call( - [ - "nix", - "--extra-experimental-features", - "nix-command flakes", - "build", - "/path/to/file^*", - "--print-out-paths", - "--build", - ], - remote=build_host, - stdout=PIPE, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "eval", + "--raw", + '/flake.nix#nixosConfigurations."hostname".config.system.build.toplevel.drvPath', + "--flake", + ], + stdout=PIPE, + ), + call( + [ + "nix-copy-closure", + "--copy", + "--to", + "user@host", + Path("/path/to/file"), + ], + append_local_env={ + "NIX_SSHOPTS": " ".join(["--ssh opts", *p.SSH_DEFAULT_OPTS]), + }, + ), + call( + [ + "nix", + "--extra-experimental-features", + "nix-command flakes", + "build", + "/path/to/file^*", + "--print-out-paths", + "--build", + ], + remote=build_host, + stdout=PIPE, + ), + ] def test_copy_closure(monkeypatch: MonkeyPatch) -> None: @@ -465,7 +461,7 @@ def test_get_nixpkgs_rev(tmpdir: Path) -> None: ], ) as mock_run: assert n.get_nixpkgs_rev(tmpdir) == ".git.0f7c82403fd6" - mock_run.assert_has_calls(expected_calls) + assert mock_run.mock_calls == expected_calls with patch( get_qualified_name(n.run_wrapper, n), @@ -476,7 +472,7 @@ def test_get_nixpkgs_rev(tmpdir: Path) -> None: ], ) as mock_run: assert n.get_nixpkgs_rev(tmpdir) == ".git.0f7c82403fd6M" - mock_run.assert_has_calls(expected_calls) + assert mock_run.mock_calls == expected_calls def test_get_generations(tmp_path: Path) -> None: @@ -821,20 +817,23 @@ def test_set_profile(mock_run: Mock) -> None: elevate=e.NO_ELEVATOR, ) - mock_run.assert_has_calls( - [ - call( - ["mkdir", "-p", profile_path.parent], - remote=target_host, - elevate=e.NO_ELEVATOR, - ), - call( - ["nix-env", "-p", profile_path, "--set", config_path], - remote=target_host, - elevate=e.NO_ELEVATOR, - ), - ] - ) + assert mock_run.mock_calls == [ + call( + ["test", "-f", Path("/path/to/config/nixos-version")], + remote=m.Remote(host="user@localhost", opts=[], store_type="ssh"), + check=False, + ), + call( + ["mkdir", "-p", profile_path.parent], + remote=target_host, + elevate=e.NO_ELEVATOR, + ), + call( + ["nix-env", "-p", profile_path, "--set", config_path], + remote=target_host, + elevate=e.NO_ELEVATOR, + ), + ] mock_run.reset_mock() mock_run.return_value = CompletedProcess([], 1) diff --git a/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_services.py b/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_services.py index 60ba1de9351b..2d158da1be70 100644 --- a/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_services.py +++ b/pkgs/by-name/ni/nixos-rebuild-ng/src/tests/test_services.py @@ -77,15 +77,13 @@ def test_reexec( mock_build.return_value = Path("/path") s.reexec(argv, args, grouped_nix_args) - mock_build.assert_has_calls( - [ - call( - s.NIXOS_REBUILD_ATTR, - n.models.BuildAttr(ANY, ANY), - {"build": True, "no_out_link": True}, - ) - ] - ) + assert mock_build.mock_calls == [ + call( + s.NIXOS_REBUILD_ATTR, + n.models.BuildAttr(ANY, ANY), + {"build": True, "no_out_link": True}, + ) + ] # do not exec if there is no new version mock_execve.assert_not_called() diff --git a/pkgs/by-name/ol/ollama/package.nix b/pkgs/by-name/ol/ollama/package.nix index 5b69b5e67bdf..3884ff685e18 100644 --- a/pkgs/by-name/ol/ollama/package.nix +++ b/pkgs/by-name/ol/ollama/package.nix @@ -111,12 +111,12 @@ let # vendored in-tree. Pre-stage the pin (tracks upstream's # `LLAMA_CPP_VERSION` file) so the FetchContent step uses our copy # instead of trying to clone over the network in the sandbox. - llamaCppVersion = "b11081"; + llamaCppVersion = "b11232"; llamaCppSrc = fetchFromGitHub { owner = "ggml-org"; repo = "llama.cpp"; tag = llamaCppVersion; - hash = "sha256-yI/oNTMzOO9Cu0xVp0YYbbgvlwTggJAPJMooDfVnMvU="; + hash = "sha256-2+yobqi5pOI8FyMK2StFIWAOLR2JgQGh/7gX6o4k8JU="; }; wrapperOptions = [ @@ -152,13 +152,13 @@ let in goBuild (finalAttrs: { pname = "ollama"; - version = "0.34.4"; + version = "0.35.1"; src = fetchFromGitHub { owner = "ollama"; repo = "ollama"; tag = "v${finalAttrs.version}"; - hash = "sha256-Wg1lVSJjN67TSIX75Xp/QyiuCW+HirpdJZIm92J0j6o="; + hash = "sha256-5qJyJhqL/Zhfq2s/Z3x5Sq0GFgBai812cQkgNq82nm4="; }; vendorHash = "sha256-45FfI47tNHBPYOBLRrwuhADCUtkjAhlFrExlEy9piMI="; diff --git a/pkgs/by-name/op/openscap/package.nix b/pkgs/by-name/op/openscap/package.nix index ed93ff9fcb87..71ddd49870d0 100644 --- a/pkgs/by-name/op/openscap/package.nix +++ b/pkgs/by-name/op/openscap/package.nix @@ -31,7 +31,7 @@ system-sendmail, curl, procps, - systemd, + systemdLibs, perl, doxygen, pkg-config, @@ -86,7 +86,7 @@ stdenv.mkDerivation (finalAttrs: { python3 libgcrypt libxml2 - systemd + systemdLibs haskellPackages.pthread graphviz system-sendmail diff --git a/pkgs/by-name/pb/pbm/package.nix b/pkgs/by-name/pb/pbm/package.nix index 55ae92949bd3..eea34423e351 100644 --- a/pkgs/by-name/pb/pbm/package.nix +++ b/pkgs/by-name/pb/pbm/package.nix @@ -2,9 +2,9 @@ buildDotnetGlobalTool { pname = "pbm"; - version = "1.5.0"; + version = "1.5.1"; - nugetHash = "sha256-MDsu9+EtgiDXPHKDMkbfzekPts064g39tbGJj9vSGMc="; + nugetHash = "sha256-8H4qT1BMvLf3CogaEUF3mYJIeChQZH+xeZsGUlkePBQ="; meta = { description = "CLI for managing Akka.NET applications and Akka.NET Clusters"; diff --git a/pkgs/by-name/pd/pdfjs/package.nix b/pkgs/by-name/pd/pdfjs/package.nix index ac8be4748b4a..e65518609a90 100644 --- a/pkgs/by-name/pd/pdfjs/package.nix +++ b/pkgs/by-name/pd/pdfjs/package.nix @@ -6,14 +6,14 @@ stdenvNoCC.mkDerivation (finalAttrs: { pname = "pdfjs"; - version = "6.3.289"; + version = "6.4.299"; strictDeps = true; __structuredAttrs = true; src = fetchzip { url = "https://github.com/mozilla/pdf.js/releases/download/v${finalAttrs.version}/pdfjs-${finalAttrs.version}-dist.zip"; - hash = "sha256-v8LoUEOgG8t1Al4vpKrXZ3D4HEDXd4bqRUFqUbN63qk="; + hash = "sha256-UHMYW6fHRL7by4sP7NXE5NuTKtmUPfInK6KunbnP88w="; stripRoot = false; }; diff --git a/pkgs/by-name/pi/pi-coding-agent/package.nix b/pkgs/by-name/pi/pi-coding-agent/package.nix index 29250a74b1a9..6550a7ca3ccd 100644 --- a/pkgs/by-name/pi/pi-coding-agent/package.nix +++ b/pkgs/by-name/pi/pi-coding-agent/package.nix @@ -13,16 +13,16 @@ }: buildNpmPackage (finalAttrs: { pname = "pi-coding-agent"; - version = "1.0.0"; + version = "1.0.2"; src = fetchFromGitHub { owner = "earendil-works"; repo = "pi"; tag = "v${finalAttrs.version}"; - hash = "sha256-CGznIVHXG6gr2F8vzHcR/v4P9xJgZHeMTt/CJ/kB78o="; + hash = "sha256-DjWJE7KcCdNF/M3RrO76rKCSd6oFLo2dX9wFT0nwEXk="; }; - npmDepsHash = "sha256-ndEvWdB6sa5nNNtabk2OMZKUFG9x3op185deZHxFnXk="; + npmDepsHash = "sha256-gW0JO84SrPl3PDUu7eBzOKaNGSif23J1xY1tpS/oVhQ="; # The provider model catalog (packages/ai/src/providers/data/) is generated by # a network fetch (models.dev plus provider APIs) and is gitignored upstream, @@ -31,7 +31,7 @@ buildNpmPackage (finalAttrs: { # under dist/providers/data/. Bump this hash alongside version. modelData = fetchurl { url = "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-${finalAttrs.version}.tgz"; - hash = "sha256-85uZwpuFmPF1sQhA5dKoGYPnwM5crk19+DoQB0R9LCs="; + hash = "sha256-isjl+r1l4PDsuFOLYhGCSFn1mXWUAF16A+H3CzhDihc="; }; preConfigure = '' diff --git a/pkgs/by-name/re/reframe/package.nix b/pkgs/by-name/re/reframe/package.nix index 7a540d83b56c..b5a5e2d8a1e6 100644 --- a/pkgs/by-name/re/reframe/package.nix +++ b/pkgs/by-name/re/reframe/package.nix @@ -6,7 +6,7 @@ meson, ninja, cmake, - systemd, + systemdLibs, glib, gtk4, libdrm, @@ -43,7 +43,7 @@ stdenv.mkDerivation (finalAttrs: { ]; buildInputs = [ - systemd + systemdLibs glib gtk4 libdrm diff --git a/pkgs/by-name/re/remnote/package.nix b/pkgs/by-name/re/remnote/package.nix index 69fa4b87a097..008cd400909c 100644 --- a/pkgs/by-name/re/remnote/package.nix +++ b/pkgs/by-name/re/remnote/package.nix @@ -8,11 +8,11 @@ appimageTools.wrapType2 (finalAttrs: { pname = "remnote"; - version = "1.28.28"; + version = "1.28.37"; src = fetchurl { url = "https://download2.remnote.io/remnote-desktop2/RemNote-${finalAttrs.version}.AppImage"; - hash = "sha256-YUnIWxtMg7zJjJVkhkp+MPKnQ0uUOSZC2tmQ7JjXcaI="; + hash = "sha256-K972+NFq5qmgeu8+kF5v1TOrP+wg+zHjgnmlveiJyyk="; }; nativeBuildInputs = [ makeWrapper ]; diff --git a/pkgs/by-name/sa/samplv1/package.nix b/pkgs/by-name/sa/samplv1/package.nix index 6d0af33b0830..592e973a5e1f 100644 --- a/pkgs/by-name/sa/samplv1/package.nix +++ b/pkgs/by-name/sa/samplv1/package.nix @@ -15,11 +15,11 @@ stdenv.mkDerivation (finalAttrs: { pname = "samplv1"; - version = "1.4.2"; + version = "1.5.0"; src = fetchurl { url = "mirror://sourceforge/samplv1/samplv1-${finalAttrs.version}.tar.gz"; - hash = "sha256-DAD8y9BhVyCxi7VPWLXKkcv6kxFQOOmTDB2ntJiG0Lw="; + hash = "sha256-EzmkDwxU6C8/ExQUQ3dWW2Tez8h/cg8Q+x6CWfnL5kw="; }; nativeBuildInputs = [ diff --git a/pkgs/by-name/sn/snakemake/package.nix b/pkgs/by-name/sn/snakemake/package.nix index d3fd4a7a9acb..dbad1dead0c6 100644 --- a/pkgs/by-name/sn/snakemake/package.nix +++ b/pkgs/by-name/sn/snakemake/package.nix @@ -36,28 +36,30 @@ python3Packages.buildPythonApplication (finalAttrs: { build-system = with python3Packages; [ setuptools-scm ]; pythonRelaxDeps = [ + "docutils" "packaging" "sqlmodel" ]; dependencies = with python3Packages; [ - appdirs conda-inject configargparse connection-pool - datrie docutils + dpath gitpython humanfriendly immutables jinja2 jsonschema nbformat + packaging + platformdirs psutil pulp pygments pyyaml + referencing requests - reretry smart-open snakemake-interface-common snakemake-interface-executor-plugins @@ -66,11 +68,9 @@ python3Packages.buildPythonApplication (finalAttrs: { snakemake-interface-scheduler-plugins snakemake-interface-storage-plugins sqlmodel - stopit tabulate tenacity throttler - toposort wrapt yte ]; diff --git a/pkgs/by-name/sp/spicetify-cli/package.nix b/pkgs/by-name/sp/spicetify-cli/package.nix index af80feed4008..1f3a70e6b7c6 100644 --- a/pkgs/by-name/sp/spicetify-cli/package.nix +++ b/pkgs/by-name/sp/spicetify-cli/package.nix @@ -9,16 +9,16 @@ }: buildGoModule (finalAttrs: { pname = "spicetify-cli"; - version = "2.45.1"; + version = "2.45.3"; src = fetchFromGitHub { owner = "spicetify"; repo = "cli"; tag = "v${finalAttrs.version}"; - hash = "sha256-Mu97p0HlvmEMkPV/VvHztJ1VqocxXoAXRtDKLGYd9mk="; + hash = "sha256-+EsZHr9cJDvSlYnwlmLjv0iT6s6gpMCd3+RKl0pUbFM="; }; - vendorHash = "sha256-nrUaocs+so35MDxC6TkRSakYKWmhoysrvhE6fXRvYco="; + vendorHash = "sha256-1yoFdrSgKB1kWtt7wz/gzNvl+v8v9Z/Ab3Kegb/5Q7M="; postPatch = '' substituteInPlace src/preprocess/preprocess.go \ diff --git a/pkgs/by-name/ss/sssd/package.nix b/pkgs/by-name/ss/sssd/package.nix index 5ce5da5efd02..489f6eb38e45 100644 --- a/pkgs/by-name/ss/sssd/package.nix +++ b/pkgs/by-name/ss/sssd/package.nix @@ -40,7 +40,7 @@ libxslt, libxml2, libuuid, - systemd, + systemdLibs, nspr, check, cmocka, @@ -191,7 +191,7 @@ stdenv.mkDerivation (finalAttrs: { libxslt libxml2 libuuid - systemd + systemdLibs nspr check cmocka diff --git a/pkgs/by-name/sw/swaymux/package.nix b/pkgs/by-name/sw/swaymux/package.nix index e2e3443a5cb3..9aebd885087f 100644 --- a/pkgs/by-name/sw/swaymux/package.nix +++ b/pkgs/by-name/sw/swaymux/package.nix @@ -5,9 +5,10 @@ nlohmann_json, qt6, stdenv, + nix-update-script, }: stdenv.mkDerivation (finalAttrs: { - version = "1.1"; + version = "1.1.1"; pname = "swaymux"; src = fetchFromGitea { @@ -15,7 +16,7 @@ stdenv.mkDerivation (finalAttrs: { domain = "git.grimmauld.de"; owner = "Grimmauld"; repo = "swaymux"; - hash = "sha256-OMJ9wKNuvD1Z9KV7Bp7aIA5gWbBl9PmTdGcGegE0vqM="; + hash = "sha256-pe0YrhRJdy/3GePzM1RD1vQ0fGisImNHKzGMFeYQN88="; }; buildInputs = [ @@ -30,6 +31,8 @@ stdenv.mkDerivation (finalAttrs: { doCheck = true; + passthru.updateScript = nix-update-script { }; + meta = { changelog = "https://git.grimmauld.de/Grimmauld/swaymux/commits/branch/main"; description = "Program to quickly navigate sway"; diff --git a/pkgs/by-name/ta/tang/package.nix b/pkgs/by-name/ta/tang/package.nix index 97deec22126b..6b7980be892a 100644 --- a/pkgs/by-name/ta/tang/package.nix +++ b/pkgs/by-name/ta/tang/package.nix @@ -7,7 +7,7 @@ jansson, jose, http-parser, - systemd, + systemdLibs, meson, ninja, makeWrapper, @@ -40,7 +40,7 @@ stdenv.mkDerivation (finalAttrs: { jansson jose http-parser - systemd + systemdLibs ]; outputs = [ diff --git a/pkgs/by-name/ta/tarantool/package.nix b/pkgs/by-name/ta/tarantool/package.nix index 62c4a46edc8f..7723148d1367 100644 --- a/pkgs/by-name/ta/tarantool/package.nix +++ b/pkgs/by-name/ta/tarantool/package.nix @@ -17,13 +17,13 @@ stdenv.mkDerivation (finalAttrs: { pname = "tarantool"; - version = "3.8.0"; + version = "3.8.1"; src = fetchFromGitHub { owner = "tarantool"; repo = "tarantool"; tag = finalAttrs.version; - hash = "sha256-X3Bqwt3HSFWr1klPtrIaE5jMAzFJO4mRcowWJCnqUac="; + hash = "sha256-ZdGbBOp34H+n0DHn+Ocbj2T5Kzta+mQSEhu7pRrQy64="; fetchSubmodules = true; }; diff --git a/pkgs/by-name/tg/tgt/package.nix b/pkgs/by-name/tg/tgt/package.nix index e78ffd04a1e6..4dda633a3e39 100644 --- a/pkgs/by-name/tg/tgt/package.nix +++ b/pkgs/by-name/tg/tgt/package.nix @@ -4,7 +4,7 @@ fetchFromGitHub, libxslt, libaio, - systemd, + systemdLibs, perl, docbook_xsl, coreutils, @@ -31,7 +31,7 @@ stdenv.mkDerivation (finalAttrs: { ]; buildInputs = [ - systemd + systemdLibs libaio ]; diff --git a/pkgs/by-name/th/thunderbird-mcp/package-lock.json b/pkgs/by-name/th/thunderbird-mcp/package-lock.json index b6898bb0ad9b..933a8832b5a2 100644 --- a/pkgs/by-name/th/thunderbird-mcp/package-lock.json +++ b/pkgs/by-name/th/thunderbird-mcp/package-lock.json @@ -1,12 +1,12 @@ { "name": "thunderbird-mcp", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thunderbird-mcp", - "version": "0.9.1", + "version": "0.9.2", "license": "MIT", "bin": { "thunderbird-mcp": "mcp-bridge.cjs" @@ -22,10 +22,34 @@ "node": ">=18.0.0" } }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { @@ -80,9 +104,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", - "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -137,9 +161,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -216,6 +240,30 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/esrecurse": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", @@ -238,9 +286,9 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -277,6 +325,13 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -288,16 +343,30 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" + } + }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" } }, "node_modules/cross-spawn": { @@ -341,9 +410,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.24.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz", - "integrity": "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", "dev": true, "license": "MIT", "dependencies": { @@ -368,9 +437,9 @@ } }, "node_modules/eslint": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", - "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", + "version": "10.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.12.0.tgz", + "integrity": "sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==", "dev": true, "license": "MIT", "workspaces": [ @@ -380,9 +449,9 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.6.0", + "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", + "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -397,14 +466,14 @@ "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -465,9 +534,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.2.2.tgz", - "integrity": "sha512-gOO0lIqwEjZ750kv9/SptCWArUoAZXJoBr0vYWTO2dCBxctHUXlBIigiC8xuxxr/NKqgIT6Ehz1xRcilj8a5cA==", + "version": "18.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.4.1.tgz", + "integrity": "sha512-2sBReWOvCbzgkPri9M5SFmD5EbIwZLa1xz6B5RZsrI19WSFKpyx1sOMr+pdk8puCiXuEgCbErEHy1PuaUrc/4w==", "dev": true, "license": "MIT", "dependencies": { @@ -478,6 +547,7 @@ "globals": "^15.11.0", "globrex": "^0.1.2", "ignore": "^5.3.2", + "js-yaml": "^5.4.1", "semver": "^7.6.3" }, "engines": { @@ -650,16 +720,13 @@ "license": "MIT" }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" + "flat-cache": "^6.1.23" } }, "node_modules/find-up": { @@ -680,30 +747,28 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", "dev": true, "license": "MIT", "dependencies": { @@ -727,9 +792,9 @@ } }, "node_modules/globals": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", - "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "version": "17.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.13.0.tgz", + "integrity": "sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==", "dev": true, "license": "MIT", "engines": { @@ -753,6 +818,26 @@ "dev": true, "license": "ISC" }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -803,12 +888,28 @@ "dev": true, "license": "ISC" }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "node_modules/js-yaml": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.4.2.tgz", + "integrity": "sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.mjs" + } }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -825,13 +926,13 @@ "license": "MIT" }, "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/levn": { @@ -865,13 +966,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -984,6 +1085,26 @@ "node": ">=6" } }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", diff --git a/pkgs/by-name/th/thunderbird-mcp/package.nix b/pkgs/by-name/th/thunderbird-mcp/package.nix index 87ca28a07a39..2467feac15b7 100644 --- a/pkgs/by-name/th/thunderbird-mcp/package.nix +++ b/pkgs/by-name/th/thunderbird-mcp/package.nix @@ -7,13 +7,13 @@ buildNpmPackage (finalAttrs: { pname = "thunderbird-mcp"; - version = "0.9.1"; + version = "0.9.2"; src = fetchFromGitHub { owner = "TKasperczyk"; repo = "thunderbird-mcp"; tag = "v${finalAttrs.version}"; - hash = "sha256-uN/xvN+bbtFTWMd2Kko/d07FXna5e7jdfZPX8vAwfa4="; + hash = "sha256-OH8uAy9ka2ao/7UF2Bi4dfhOa0IZz+z2Bm6MpfBF1Gk="; }; postPatch = '' @@ -23,7 +23,7 @@ buildNpmPackage (finalAttrs: { forceEmptyCache = true; dontNpmBuild = true; - npmDepsHash = "sha256-Dhm/6nJOGAFKUTmnWmDfnsLyYcDSVPvrWS4DlyOlBNk="; + npmDepsHash = "sha256-cngbvIIP7lgwuXhIM6CA7oNlg9ctj9I2AA3SMKxk54g="; doCheck = true; diff --git a/pkgs/by-name/tt/tt-burnin/package.nix b/pkgs/by-name/tt/tt-burnin/package.nix index 001b4cca5bf9..087872cea41e 100644 --- a/pkgs/by-name/tt/tt-burnin/package.nix +++ b/pkgs/by-name/tt/tt-burnin/package.nix @@ -1,27 +1,30 @@ { lib, fetchFromGitHub, - python3Packages, + python313Packages, versionCheckHook, }: -python3Packages.buildPythonApplication (finalAttrs: { +# jsons depends on typish, which is disabled on Python 3.14 +# TODO: switch back to python3Packages once typish supports Python 3.14 +python313Packages.buildPythonApplication (finalAttrs: { pname = "tt-burnin"; - version = "0.4.0"; + version = "0.4.4"; pyproject = true; + __structuredAttrs = true; src = fetchFromGitHub { owner = "tenstorrent"; repo = "tt-burnin"; tag = "v${finalAttrs.version}"; - hash = "sha256-NI32BerBCuMMulB2fsseeoWI50iklpNqMyTs4BArl2A="; + hash = "sha256-ZHc9qhOZE8fv/oj0bHGTyncZNT1mJtk1pFAPCRY4TtE="; }; - build-system = with python3Packages; [ + build-system = with python313Packages; [ setuptools setuptools-scm ]; - dependencies = with python3Packages; [ + dependencies = with python313Packages; [ pyluwen tt-tools-common jsons diff --git a/pkgs/by-name/tt/tt-metal/deps.nix b/pkgs/by-name/tt/tt-metal/deps.nix index e447c89c75ad..92addbafdf28 100644 --- a/pkgs/by-name/tt/tt-metal/deps.nix +++ b/pkgs/by-name/tt/tt-metal/deps.nix @@ -1,12 +1,39 @@ -{ fetchFromGitHub }: { + fetchFromGitHub, + applyPatches, + ttMetalSrc, +}: +{ + # third_party/CMakeLists.txt + blake3 = applyPatches { + src = fetchFromGitHub { + owner = "BLAKE3-team"; + repo = "BLAKE3"; + tag = "1.8.4"; + hash = "sha256-Xz0LH0YpUjDishvXsW6VNK8msFlPXg08wFoSfbgws0g="; + }; + patches = [ + "${ttMetalSrc}/third_party/blake3_install_dir.patch" + ]; + }; + protobuf = applyPatches { + src = fetchFromGitHub { + owner = "protocolbuffers"; + repo = "protobuf"; + tag = "v21.12"; + hash = "sha256-VZQEFHq17UsTH5CZZOcJBKiScGV2xPJ/e6gkkVliRCU="; + }; + patches = [ + "${ttMetalSrc}/third_party/protobuf_noreturn.patch" + ]; + }; yaml-cpp = fetchFromGitHub { owner = "jbeder"; repo = "yaml-cpp"; - tag = "0.8.0"; - hash = "sha256-J87oS6Az1/vNdyXu3L7KmUGWzU0IAkGrGMUUha+xDXI="; + rev = "2f86d13775d119edbb69af52e5f566fd65c6953b"; + hash = "sha256-GtUTbEaRR3+GfVkt3t8EsqBHVffVKOl8urtQTaHozIo="; }; - googletest = fetchFromGitHub { + gtest = fetchFromGitHub { owner = "google"; repo = "googletest"; tag = "v1.13.0"; @@ -18,29 +45,35 @@ tag = "v1.2.6"; hash = "sha256-qjy5KyAm7/WeCyxMu/5QrBVjDSJPs0q/ZPyQwXp0WLA="; }; - fmt = fetchFromGitHub { - owner = "fmtlib"; - repo = "fmt"; - tag = "11.1.4"; - hash = "sha256-sUbxlYi/Aupaox3JjWFqXIjcaQa0LFjclQAOleT+FRA="; - }; enchantum = fetchFromGitHub { owner = "ZXShady"; repo = "enchantum"; rev = "8ca5b0eb7e7ebe0252e5bc6915083f1dd1b8294e"; hash = "sha256-q2bbNAMpNJYedekEDtTQ2qI2+GPdkTsuxAHCBaAnuTA="; }; - range-v3 = fetchFromGitHub { - owner = "ericniebler"; - repo = "range-v3"; - tag = "0.12.0"; - hash = "sha256-bRSX91+ROqG1C3nB9HSQaKgLzOHEFy9mrD2WW3PRBWU="; + fmt = fetchFromGitHub { + owner = "fmtlib"; + repo = "fmt"; + tag = "11.1.4"; + hash = "sha256-sUbxlYi/Aupaox3JjWFqXIjcaQa0LFjclQAOleT+FRA="; }; - pybind11 = fetchFromGitHub { - owner = "pybind"; - repo = "pybind11"; - tag = "v2.13.6"; - hash = "sha256-SNLdtrOjaC3lGHN9MAqTf51U9EzNKQLyTMNPe0GcdrU="; + range-v3 = applyPatches { + src = fetchFromGitHub { + owner = "ericniebler"; + repo = "range-v3"; + tag = "0.12.0"; + hash = "sha256-bRSX91+ROqG1C3nB9HSQaKgLzOHEFy9mrD2WW3PRBWU="; + }; + patches = [ + "${ttMetalSrc}/third_party/range-v3.patch" + ]; + }; + nanobind = fetchFromGitHub { + owner = "wjakob"; + repo = "nanobind"; + rev = "86e5626728fc282637a6c338597120913dded1bb"; + fetchSubmodules = true; + hash = "sha256-jAg/CotM361gc+5Ymsz8jP0ddLBzrFTxCkssJKFe0NY="; }; nlohmann_json = fetchFromGitHub { owner = "nlohmann"; @@ -48,23 +81,38 @@ tag = "v3.11.3"; hash = "sha256-7F0Jon+1oWL7uqet5i1IgHX0fUw/+z0QwEcA3zs5xHg="; }; - xtl = fetchFromGitHub { - owner = "xtensor-stack"; - repo = "xtl"; - tag = "0.8.0"; - hash = "sha256-hhXM2fG3Yl4KeEJlOAcNPVLJjKy9vFlI63lhbmIAsT8="; + xtl = applyPatches { + src = fetchFromGitHub { + owner = "xtensor-stack"; + repo = "xtl"; + tag = "0.8.0"; + hash = "sha256-hhXM2fG3Yl4KeEJlOAcNPVLJjKy9vFlI63lhbmIAsT8="; + }; + patches = [ + "${ttMetalSrc}/third_party/xtl.patch" + ]; }; - xtensor = fetchFromGitHub { - owner = "xtensor-stack"; - repo = "xtensor"; - tag = "0.26.0"; - hash = "sha256-gAGLb5NPT4jiIpXONqY+kalxKCFKFXlNqbM79x1lTKE="; + xtensor = applyPatches { + src = fetchFromGitHub { + owner = "xtensor-stack"; + repo = "xtensor"; + tag = "0.26.0"; + hash = "sha256-gAGLb5NPT4jiIpXONqY+kalxKCFKFXlNqbM79x1lTKE="; + }; + patches = [ + "${ttMetalSrc}/third_party/xtensor.patch" + ]; }; - xtensor-blas = fetchFromGitHub { - owner = "xtensor-stack"; - repo = "xtensor-blas"; - tag = "0.22.0"; - hash = "sha256-Lg6MjJbZUCMqv4eSiZQrLfJy/86RWQ9P85UfeIQJ6bk="; + xtensor-blas = applyPatches { + src = fetchFromGitHub { + owner = "xtensor-stack"; + repo = "xtensor-blas"; + tag = "0.22.0"; + hash = "sha256-Lg6MjJbZUCMqv4eSiZQrLfJy/86RWQ9P85UfeIQJ6bk="; + }; + patches = [ + "${ttMetalSrc}/third_party/xtensor-blas.patch" + ]; }; benchmark = fetchFromGitHub { owner = "google"; @@ -78,24 +126,18 @@ tag = "v3.7.0"; hash = "sha256-q2IYhG84hPIZhuogWf6ojDG9S9ZyuJz9s14kQyIc6t0="; }; + flatbuffers = fetchFromGitHub { + owner = "google"; + repo = "flatbuffers"; + tag = "v24.3.25"; + hash = "sha256-uE9CQnhzVgOweYLhWPn2hvzXHyBbFiFVESJ1AEM3BmA="; + }; simd-everywhere = fetchFromGitHub { owner = "simd-everywhere"; repo = "simde"; tag = "v0.8.2"; hash = "sha256-igjDHCpKXy6EbA9Mf6peL4OTVRPYTV0Y2jbgYQuWMT4="; }; - msgpack = fetchFromGitHub { - owner = "msgpack"; - repo = "msgpack-c"; - tag = "cpp-6.1.0"; - hash = "sha256-VqzFmm3MmMhWyooOsz1d9gwwbn/fnnxpkCFwqKR6los="; - }; - tokenizers-cpp = fetchFromGitHub { - owner = "mlc-ai"; - repo = "tokenizers-cpp"; - rev = "55d53aa38dc8df7d9c8bd9ed50907e82ae83ce66"; - hash = "sha256-CkW8S6LHHOY+tz3hHoWBzwGb3f25LFp41F/jH4pdKI4="; - }; spdlog = fetchFromGitHub { owner = "gabime"; repo = "spdlog"; @@ -105,26 +147,70 @@ tt-logger = fetchFromGitHub { owner = "tenstorrent"; repo = "tt-logger"; - tag = "v1.1.5"; - hash = "sha256-lw8L4pCAGObCkiuF/JFC9PmcQgwmJZOOo1cbaUMvo+I="; + tag = "v1.1.8"; + hash = "sha256-cAQLxxwxRkRh1hwDVyDPOr3wsiC2DStUP0UMSiY0vHg="; }; + cadical = applyPatches { + src = fetchFromGitHub { + owner = "arminbiere"; + repo = "cadical"; + tag = "rel-2.2.1"; + hash = "sha256-dYRaw9DI63Nqz0IJkfQYU4y00KSfq1Xv0xZuL1G15CY="; + }; + patches = [ + "${ttMetalSrc}/third_party/cadical_vivify_include_tuple.patch" + ]; + }; + capnproto = applyPatches { + src = fetchFromGitHub { + owner = "capnproto"; + repo = "capnproto"; + rev = "d135c9ca5e15219eaf131dfce1a41afdbaea9aab"; + hash = "sha256-aDcn4bLZGq8915/NPPQsN5Jv8FRWd8cAspkG3078psc="; + }; + patches = [ + "${ttMetalSrc}/third_party/capnproto_capture_this.patch" + "${ttMetalSrc}/third_party/capnproto_pthread.patch" + ]; + }; + ttexalens = fetchFromGitHub { + owner = "tenstorrent"; + repo = "tt-exalens"; + rev = "6f5720240b7254b25cb3d78aef81769fc12a30f9"; + hash = "sha256-QX9fh4KPJEj4AQjDViPQgVW1JxOADWJk0SlASLJTUCY="; + }; + + # tt-exalens: cmake/native_elf.cmake + libdwarf = fetchFromGitHub { + owner = "davea42"; + repo = "libdwarf-code"; + tag = "v2.3.1"; + hash = "sha256-azVCzQt9oA40YACa9PkdNt0D8vWRNHXXGoSFOYNJxgA="; + }; + elfio = applyPatches { + src = fetchFromGitHub { + owner = "serge1"; + repo = "ELFIO"; + tag = "Release_3.12"; + hash = "sha256-tDRBscs2L/3gYgLQvb1+8nNxqkr8v1xBkeDXuOqShX4="; + }; + patches = [ + ./elfio-cstdint.patch + ]; + }; + + # tt_metal/third_party/umd/third_party/CMakeLists.txt nanomsg = fetchFromGitHub { owner = "nanomsg"; repo = "nng"; tag = "v1.8.0"; hash = "sha256-E2uosZrmxO3fqwlLuu5e36P70iGj5xUlvhEb+1aSvOA="; }; - flatbuffers = fetchFromGitHub { - owner = "google"; - repo = "flatbuffers"; - tag = "v24.3.25"; - hash = "sha256-uE9CQnhzVgOweYLhWPn2hvzXHyBbFiFVESJ1AEM3BmA="; - }; libuv = fetchFromGitHub { owner = "libuv"; repo = "libuv"; - tag = "v1.48.0"; - hash = "sha256-U68BmIQNpmIy3prS7LkYl+wvDJQNikoeFiKh50yQFoA="; + tag = "v1.51.0"; + hash = "sha256-ayTk3qkeeAjrGj5ab7wF7vpWI8XWS1EeKKUqzaD/LY0="; }; cxxopts = fetchFromGitHub { owner = "jarro2783"; @@ -132,11 +218,10 @@ rev = "dbf4c6a66816f6c3872b46cc6af119ad227e04e1"; hash = "sha256-2Z8DT9ihlmbiqCi8gcNzW4C5AUh4xCrpCKrGbRYcreQ="; }; - nanobind = fetchFromGitHub { - owner = "wjakob"; - repo = "nanobind"; - tag = "v2.7.0"; - fetchSubmodules = true; - hash = "sha256-ex5svqDp9XJtiNCxu0249ORL6LbG679U6PvKQaWANmE="; + umd_asio = fetchFromGitHub { + owner = "chriskohlhoff"; + repo = "asio"; + tag = "asio-1-30-2"; + hash = "sha256-g+ZPKBUhBGlgvce8uTkuR983unD2kbQKgoddko7x+fk="; }; } diff --git a/pkgs/by-name/tt/tt-metal/elfio-cstdint.patch b/pkgs/by-name/tt/tt-metal/elfio-cstdint.patch new file mode 100644 index 000000000000..019878aa0563 --- /dev/null +++ b/pkgs/by-name/tt/tt-metal/elfio-cstdint.patch @@ -0,0 +1,11 @@ +--- a/elfio/elf_types.hpp ++++ b/elfio/elf_types.hpp +@@ -23,6 +23,8 @@ THE SOFTWARE. + #ifndef ELFTYPES_H + #define ELFTYPES_H + ++#include ++ + #ifdef __cplusplus + namespace ELFIO { + #endif diff --git a/pkgs/by-name/tt/tt-metal/package.nix b/pkgs/by-name/tt/tt-metal/package.nix index 1647b5053f9f..4372e08d0058 100644 --- a/pkgs/by-name/tt/tt-metal/package.nix +++ b/pkgs/by-name/tt/tt-metal/package.nix @@ -3,6 +3,7 @@ stdenv, fetchFromGitHub, fetchurl, + applyPatches, callPackage, pkg-config, cmake, @@ -15,14 +16,14 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "tt-metal"; - version = "0.62.2"; + version = "0.79.0"; src = fetchFromGitHub { owner = "tenstorrent"; repo = "tt-metal"; tag = "v${finalAttrs.version}"; fetchSubmodules = true; - hash = "sha256-ZIUjZLifRVmpWpG8Ty+I+pwgpIf5r9gJkI8ULTau4OE="; + hash = "sha256-sA9ryiVDBF9yJUfQ2cQDvphEC0nVQx6X2F91s2BA8Qo="; }; cpm = fetchurl { @@ -32,6 +33,11 @@ stdenv.mkDerivation (finalAttrs: { sfpi = callPackage ./sfpi.nix { }; + patches = [ + # Remove in next release 0.80.0 + ./spsc-marker-decode-simde.patch + ]; + postUnpack = '' mkdir -p "$sourceRoot/runtime" ln -s "$sfpi" "$sourceRoot/runtime/sfpi" @@ -40,6 +46,10 @@ stdenv.mkDerivation (finalAttrs: { postPatch = '' cp $cpm cmake/CPM.cmake cp $cpm tt_metal/third_party/umd/cmake/CPM.cmake + + patchShebangs tt_metal/sfpi-info.sh tt_metal/llrt/hal/codegen + substituteInPlace tt_metal/sfpi-info.sh \ + --replace-fail 'sfpi_arch=$(uname -m)' $'sfpi_dist=debian\nsfpi_arch=$(uname -m)' ''; cmakeFlags = [ @@ -47,6 +57,7 @@ stdenv.mkDerivation (finalAttrs: { (lib.cmakeBool "CPM_USE_LOCAL_PACKAGES" true) (lib.cmakeFeature "VERSION_NUMERIC" finalAttrs.version) (lib.cmakeFeature "CMAKE_POLICY_VERSION_MINIMUM" "3.10") + (lib.cmakeBool "ENABLE_TRACY" false) ]; preConfigure = '' @@ -55,11 +66,16 @@ stdenv.mkDerivation (finalAttrs: { (name: src: "cp -r --no-preserve=ownership,mode ${src} build/_deps/${name}-src") ( import ./deps.nix { - inherit fetchFromGitHub; + inherit fetchFromGitHub applyPatches; + ttMetalSrc = finalAttrs.src; } ) } cp $cpm build/_deps/tt-logger-src/cmake/CPM.cmake + + appendToVar cmakeFlags "-Dcadical_SOURCE_DIR=$PWD/build/_deps/cadical-src" + appendToVar cmakeFlags "-DCPM_umd_asio_SOURCE=$PWD/build/_deps/umd_asio-src" + appendToVar cmakeFlags "-DCPM_ELFIO_SOURCE=$PWD/build/_deps/elfio-src" ''; # CMake install fails because "$out/include/tt-logger" tree does not exist. @@ -87,6 +103,8 @@ stdenv.mkDerivation (finalAttrs: { # Fixes the parallel hook crashing in the fixupPhase with no error. noAuditTmpdir = true; + passthru.sfpi = finalAttrs.sfpi; + meta = { description = "TT-NN operator library, and TT-Metalium low level kernel programming model"; homepage = "https://github.com/tenstorrent/tt-metal"; diff --git a/pkgs/by-name/tt/tt-metal/sfpi.nix b/pkgs/by-name/tt/tt-metal/sfpi.nix index d00f3c0c9179..af4c3c69cfba 100644 --- a/pkgs/by-name/tt/tt-metal/sfpi.nix +++ b/pkgs/by-name/tt/tt-metal/sfpi.nix @@ -5,13 +5,14 @@ runCommand, autoPatchelfHook, ncurses, - isl_0_23, mpfr, libmpc, xz, + zstd, + expat, }: let - version = "7.1.0"; + version = "7.78.0"; in runCommand "sfpi-${version}" { @@ -23,21 +24,22 @@ runCommand "sfpi-${version}" buildInputs = [ ncurses - isl_0_23 mpfr libmpc xz + zstd + expat ]; src = { aarch64-linux = fetchurl { - url = "https://github.com/tenstorrent/sfpi/releases/download/v${version}/sfpi_${version}_aarch64.txz"; - hash = "sha256-MzI159hiitk1iyeGfQaDOQZhqGjfafpCMz6zmM3HrYs="; + url = "https://github.com/tenstorrent/sfpi/releases/download/${version}/sfpi_${version}_aarch64_debian.txz"; + hash = "sha256-ATcNRyNZ6c3DOb+s5k7ATpMafr6k3+DoZJYTgd0rdHI="; }; x86_64-linux = fetchurl { - url = "https://github.com/tenstorrent/sfpi/releases/download/v${version}/sfpi_${version}_x86_64.txz"; - hash = "sha256-rQfFveg1ht+jLfk3ZOJadX26+ODE3WW5E0/18eIl7RQ="; + url = "https://github.com/tenstorrent/sfpi/releases/download/${version}/sfpi_${version}_x86_64_debian.txz"; + hash = "sha256-RkxkdZ5EG4Qda8BiFtvUcNeg8Yjg/6msjrsuQEzyRNs="; }; } ."${stdenv.hostPlatform.system}" or (throw "SFPI does not support ${stdenv.hostPlatform.system}"); diff --git a/pkgs/by-name/tt/tt-metal/spsc-marker-decode-simde.patch b/pkgs/by-name/tt/tt-metal/spsc-marker-decode-simde.patch new file mode 100644 index 000000000000..5cb24fe1c837 --- /dev/null +++ b/pkgs/by-name/tt/tt-metal/spsc-marker-decode-simde.patch @@ -0,0 +1,622 @@ +--- a/tt_metal/impl/streaming_profiler/spsc_marker_decode.hpp ++++ b/tt_metal/impl/streaming_profiler/spsc_marker_decode.hpp +@@ -17,11 +17,8 @@ + #include + #include + +-#include +- +-#if !defined(__AVX2__) +-#error "the streaming profiler decode is AVX2 code; build for x86-64-v3 or newer" +-#endif ++// SIMDe uses native AVX2 where available and supported host instructions otherwise. ++#include + + #include "hostdev/streaming_profiler_common.h" + #include "spsc_packet.h" +@@ -284,6 +281,7 @@ + // false when there is none. The chain unrolls in table order. always_inline, like the handlers it takes: a handler + // left out of line captures the walk's locals by address and pushes them all out of registers. + template ++// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward) -- Reuse the callback as an lvalue through recursive calls. + __attribute__((always_inline)) inline bool spsc_for_format(uint32_t t, H&& handle) { + if constexpr (I == kFormats.size()) { + return false; +@@ -299,6 +297,7 @@ + } + // Runs handle.template operator()() for every row whose kind Pred accepts, in table order. + template ++// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward) -- Reuse the callback as an lvalue through recursive calls. + __attribute__((always_inline)) inline void spsc_for_each_format(H&& handle) { + if constexpr (I < kFormats.size()) { + if constexpr (Pred(kFormats[I].kind)) { +@@ -324,37 +323,38 @@ + // Built at lane entry; a STICKY_TIMER re-blends only the th lanes, a STICKY_PROG only the prog lanes. + struct SpscLaneConsts { + uint64_t th_hi; +- __m256i tv, mv, coords_v; // th << 32 / prog << 32 / the coordinates, per qword +- __m256i zone_half, zone_half64, point_half, point_half64; +- __m128i tail; ++ simde__m256i tv, mv, coords_v; // th << 32 / prog << 32 / the coordinates, per qword ++ simde__m256i zone_half, zone_half64, point_half, point_half64; ++ simde__m128i tail; + }; + inline void spsc_lane_consts_th(SpscLaneConsts& c, uint32_t th) { + c.th_hi = static_cast(th) << 32; +- c.tv = _mm256_set1_epi64x(static_cast(c.th_hi)); +- const __m256i thv = _mm256_set1_epi32(static_cast(th)); +- c.zone_half = _mm256_blend_epi32(c.zone_half, thv, 0x02); +- c.point_half = _mm256_blend_epi32(c.point_half, thv, 0x02); ++ c.tv = simde_mm256_set1_epi64x(static_cast(c.th_hi)); ++ const simde__m256i thv = simde_mm256_set1_epi32(static_cast(th)); ++ c.zone_half = simde_mm256_blend_epi32(c.zone_half, thv, 0x02); ++ c.point_half = simde_mm256_blend_epi32(c.point_half, thv, 0x02); + } + inline void spsc_lane_consts_prog(SpscLaneConsts& c, uint32_t prog) { +- c.mv = _mm256_set1_epi64x(static_cast(static_cast(prog) << 32)); +- const __m256i pgv = _mm256_set1_epi32(static_cast(prog)); +- for (__m256i* h : {&c.zone_half, &c.zone_half64, &c.point_half, &c.point_half64}) { +- *h = _mm256_blend_epi32(*h, pgv, 0x20); ++ c.mv = simde_mm256_set1_epi64x(static_cast(static_cast(prog) << 32)); ++ const simde__m256i pgv = simde_mm256_set1_epi32(static_cast(prog)); ++ for (simde__m256i* h : {&c.zone_half, &c.zone_half64, &c.point_half, &c.point_half64}) { ++ *h = simde_mm256_blend_epi32(*h, pgv, 0x20); + } + } + inline void spsc_lane_consts(SpscLaneConsts& c, const SpscRecConsts& r, uint32_t th, uint32_t prog) { +- const __m256i half = +- _mm256_setr_epi32(0, 0, 0, 0, 0, 0, static_cast(r.coords[0]), static_cast(r.coords[1])); ++ const simde__m256i half = ++ simde_mm256_setr_epi32(0, 0, 0, 0, 0, 0, static_cast(r.coords[0]), static_cast(r.coords[1])); + c.zone_half = c.zone_half64 = c.point_half = c.point_half64 = half; +- c.coords_v = _mm256_set1_epi64x(static_cast(r.coords[0] | (static_cast(r.coords[1]) << 32))); +- c.tail = _mm_loadu_si128(reinterpret_cast(r.tail)); ++ c.coords_v = ++ simde_mm256_set1_epi64x(static_cast(r.coords[0] | (static_cast(r.coords[1]) << 32))); ++ c.tail = simde_mm_loadu_si128(reinterpret_cast(r.tail)); + spsc_lane_consts_th(c, th); + spsc_lane_consts_prog(c, prog); + } + // The constant half of an F record: its th lane is blended in only when the timestamp's high half comes from the + // lane's sticky. + template +-inline __m256i spsc_half(const SpscLaneConsts& c) { ++inline simde__m256i spsc_half(const SpscLaneConsts& c) { + if constexpr (F.kind == Kind::Zone) { + return F.has_ts_hi() ? c.zone_half64 : c.zone_half; + } else { +@@ -363,33 +363,35 @@ + } + + // The vector constants the kernels share; all fold to immediates once inlined. +-inline __m256i spsc_dw_type_mask() { +- return _mm256_set1_epi32(static_cast((0xFFFFFFFFu >> PP_TYPE_SHIFT) << PP_TYPE_SHIFT)); ++inline simde__m256i spsc_dw_type_mask() { ++ return simde_mm256_set1_epi32(static_cast((0xFFFFFFFFu >> PP_TYPE_SHIFT) << PP_TYPE_SHIFT)); ++} ++inline simde__m256i spsc_dw_type(uint32_t type) { ++ return simde_mm256_set1_epi32(static_cast(type << PP_TYPE_SHIFT)); + } +-inline __m256i spsc_dw_type(uint32_t type) { return _mm256_set1_epi32(static_cast(type << PP_TYPE_SHIFT)); } +-inline __m256i spsc_qw_type_mask() { +- return _mm256_set1_epi64x(static_cast((0xFFFFFFFFull >> PP_TYPE_SHIFT) << PP_TYPE_SHIFT)); ++inline simde__m256i spsc_qw_type_mask() { ++ return simde_mm256_set1_epi64x(static_cast((0xFFFFFFFFull >> PP_TYPE_SHIFT) << PP_TYPE_SHIFT)); + } +-inline __m256i spsc_qw_type(uint32_t type) { +- return _mm256_set1_epi64x(static_cast(static_cast(type) << PP_TYPE_SHIFT)); ++inline simde__m256i spsc_qw_type(uint32_t type) { ++ return simde_mm256_set1_epi64x(static_cast(static_cast(type) << PP_TYPE_SHIFT)); + } +-inline __m256i spsc_lane_idx() { return _mm256_setr_epi32(0, 1, 2, 3, 4, 5, 6, 7); } +-inline __m256i spsc_lane0() { return _mm256_setr_epi32(-1, 0, 0, 0, 0, 0, 0, 0); } ++inline simde__m256i spsc_lane_idx() { return simde_mm256_setr_epi32(0, 1, 2, 3, 4, 5, 6, 7); } ++inline simde__m256i spsc_lane0() { return simde_mm256_setr_epi32(-1, 0, 0, 0, 0, 0, 0, 0); } + + // A 32 B load holds spsc_recs_per_load whole F packets at word stride F.words; these are its lane constants. + template + inline constexpr uint32_t spsc_recs_per_load = 8 / F.words; + // -1 at word `w` of each whole packet in the load. + template +-inline __m256i spsc_lanes_at() { ++inline simde__m256i spsc_lanes_at() { + constexpr auto L = [](int k) { return (k % F.words == w && k / F.words < 8 / F.words) ? -1 : 0; }; +- return _mm256_setr_epi32(L(0), L(1), L(2), L(3), L(4), L(5), L(6), L(7)); ++ return simde_mm256_setr_epi32(L(0), L(1), L(2), L(3), L(4), L(5), L(6), L(7)); + } + // Word 0 of each whole packet down to its 27-bit id, every other lane kept. + template +-inline __m256i spsc_w0_mask() { ++inline simde__m256i spsc_w0_mask() { + constexpr auto L = [](int k) { return (k % F.words == 0 && k / F.words < 8 / F.words) ? 0x07FFFFFF : -1; }; +- return _mm256_setr_epi32(L(0), L(1), L(2), L(3), L(4), L(5), L(6), L(7)); ++ return simde_mm256_setr_epi32(L(0), L(1), L(2), L(3), L(4), L(5), L(6), L(7)); + } + // The lanes of a composed record that come from the constant half rather than the packet: the prog and coordinate + // lanes always, plus each field the format lacks. +@@ -407,68 +409,72 @@ + // {dur, 0, ...} leaves {start, dur, id | prog << 32, coords} with the borrow in the high half; the lane's tail + // follows. + template +-inline __m256i spsc_compose(__m256i l, __m256i half, __m128i tail, uint8_t* o) { ++inline simde__m256i spsc_compose(simde__m256i l, simde__m256i half, simde__m128i tail, uint8_t* o) { + constexpr int b = static_cast(r * F.words); + constexpr auto at = [](uint8_t f) { return f == kAbsent ? 0 : b + f; }; +- const __m256i s = _mm256_blend_epi32( +- _mm256_permutevar8x32_epi32( +- l, _mm256_setr_epi32(at(F.ts_lo), at(F.ts_hi), at(F.dur_lo), at(F.dur_hi), b, 0, 0, 0)), ++ const simde__m256i s = simde_mm256_blend_epi32( ++ simde_mm256_permutevar8x32_epi32( ++ l, simde_mm256_setr_epi32(at(F.ts_lo), at(F.ts_hi), at(F.dur_lo), at(F.dur_hi), b, 0, 0, 0)), + half, + spsc_blend_s()); + if constexpr (F.has_dur()) { +- const __m256i d = _mm256_blend_epi32( +- _mm256_permutevar8x32_epi32(l, _mm256_setr_epi32(at(F.dur_lo), at(F.dur_hi), 0, 0, 0, 0, 0, 0)), +- _mm256_setzero_si256(), ++ const simde__m256i d = simde_mm256_blend_epi32( ++ simde_mm256_permutevar8x32_epi32(l, simde_mm256_setr_epi32(at(F.dur_lo), at(F.dur_hi), 0, 0, 0, 0, 0, 0)), ++ simde_mm256_setzero_si256(), + spsc_blend_d()); +- _mm256_storeu_si256(reinterpret_cast<__m256i*>(o), _mm256_sub_epi64(s, d)); ++ simde_mm256_storeu_si256(reinterpret_cast(o), simde_mm256_sub_epi64(s, d)); + } else { +- _mm256_storeu_si256(reinterpret_cast<__m256i*>(o), s); ++ simde_mm256_storeu_si256(reinterpret_cast(o), s); + } +- _mm_storeu_si128(reinterpret_cast<__m128i*>(o + 32), tail); ++ simde_mm_storeu_si128(reinterpret_cast(o + 32), tail); + return s; + } + + // Eight words from p with the lanes past `readable` zero; a count of zero or less loads nothing. A record's words + // are always in range, the load's tail may not be. +-inline __m256i spsc_words(const uint32_t* p, int32_t readable) { ++inline simde__m256i spsc_words(const uint32_t* p, int32_t readable) { + if (readable >= 8) { +- return _mm256_loadu_si256(reinterpret_cast(p)); ++ return simde_mm256_loadu_si256(reinterpret_cast(p)); + } +- return _mm256_maskload_epi32( +- reinterpret_cast(p), _mm256_cmpgt_epi32(_mm256_set1_epi32(readable), spsc_lane_idx())); ++ return simde_mm256_maskload_epi32( ++ reinterpret_cast(p), simde_mm256_cmpgt_epi32(simde_mm256_set1_epi32(readable), spsc_lane_idx())); + } + // Four qword records from p, whole records only: a trailing odd word is never one, so its lane reads as zero. +-inline __m256i spsc_qwords(const uint32_t* p, int32_t readable) { ++inline simde__m256i spsc_qwords(const uint32_t* p, int32_t readable) { + if (readable >= 8) { +- return _mm256_loadu_si256(reinterpret_cast(p)); ++ return simde_mm256_loadu_si256(reinterpret_cast(p)); + } +- return _mm256_maskload_epi64( +- reinterpret_cast(p), +- _mm256_cmpgt_epi64(_mm256_set1_epi64x(readable / 2), _mm256_setr_epi64x(0, 1, 2, 3))); ++ return simde_mm256_maskload_epi64( ++ reinterpret_cast(p), ++ simde_mm256_cmpgt_epi64(simde_mm256_set1_epi64x(readable / 2), simde_mm256_setr_epi64x(0, 1, 2, 3))); + } + // Records of the type in a quad's compare result, counted from lane 0 to the first miss. A full quad is one test; + // only a partial one extracts its mask. +-inline uint32_t spsc_quad_count(__m256i c) { +- if (_mm256_testc_si256(c, _mm256_cmpeq_epi64(c, c))) { ++inline uint32_t spsc_quad_count(simde__m256i c) { ++ if (simde_mm256_testc_si256(c, simde_mm256_cmpeq_epi64(c, c))) { + return 4; + } +- return std::countr_zero(~static_cast(_mm256_movemask_pd(_mm256_castsi256_pd(c))) & 0x1Fu); ++ return std::countr_zero(~static_cast(simde_mm256_movemask_pd(simde_mm256_castsi256_pd(c))) & 0x1Fu); + } + // Four records from per-qword-lane halves: {a, b} is a record's first 16 bytes (start|ts, duration), {m, coords} + // its next 16 (id | prog << 32, the coordinates) and `tail` its last. Written whole; a partial quad's spare records + // land in the sink's slack. +-inline void spsc_store_quad(uint8_t* o, __m256i a, __m256i b, __m256i m, __m256i coords, __m128i tail) { +- const __m256i ab_lo = _mm256_unpacklo_epi64(a, b); +- const __m256i ab_hi = _mm256_unpackhi_epi64(a, b); +- const __m256i mc_lo = _mm256_unpacklo_epi64(m, coords); +- const __m256i mc_hi = _mm256_unpackhi_epi64(m, coords); ++inline void spsc_store_quad( ++ uint8_t* o, simde__m256i a, simde__m256i b, simde__m256i m, simde__m256i coords, simde__m128i tail) { ++ const simde__m256i ab_lo = simde_mm256_unpacklo_epi64(a, b); ++ const simde__m256i ab_hi = simde_mm256_unpackhi_epi64(a, b); ++ const simde__m256i mc_lo = simde_mm256_unpacklo_epi64(m, coords); ++ const simde__m256i mc_hi = simde_mm256_unpackhi_epi64(m, coords); + constexpr uint32_t R = kSpscRecBytes; +- _mm256_storeu_si256(reinterpret_cast<__m256i*>(o), _mm256_permute2x128_si256(ab_lo, mc_lo, 0x20)); +- _mm256_storeu_si256(reinterpret_cast<__m256i*>(o + R), _mm256_permute2x128_si256(ab_hi, mc_hi, 0x20)); +- _mm256_storeu_si256(reinterpret_cast<__m256i*>(o + 2 * R), _mm256_permute2x128_si256(ab_lo, mc_lo, 0x31)); +- _mm256_storeu_si256(reinterpret_cast<__m256i*>(o + 3 * R), _mm256_permute2x128_si256(ab_hi, mc_hi, 0x31)); ++ simde_mm256_storeu_si256(reinterpret_cast(o), simde_mm256_permute2x128_si256(ab_lo, mc_lo, 0x20)); ++ simde_mm256_storeu_si256( ++ reinterpret_cast(o + R), simde_mm256_permute2x128_si256(ab_hi, mc_hi, 0x20)); ++ simde_mm256_storeu_si256( ++ reinterpret_cast(o + 2 * R), simde_mm256_permute2x128_si256(ab_lo, mc_lo, 0x31)); ++ simde_mm256_storeu_si256( ++ reinterpret_cast(o + 3 * R), simde_mm256_permute2x128_si256(ab_hi, mc_hi, 0x31)); + for (uint32_t k = 0; k < 4; k++) { +- _mm_storeu_si128(reinterpret_cast<__m128i*>(o + k * R + 32), tail); ++ simde_mm_storeu_si128(reinterpret_cast(o + k * R + 32), tail); + } + } + +@@ -476,7 +482,7 @@ + template + inline SpscBlockResult spsc_one(const uint32_t* p, uint32_t readable, const SpscLaneConsts& c, uint8_t* dst) { + spsc_compose( +- _mm256_and_si256(spsc_words(p, static_cast(readable)), spsc_w0_mask()), ++ simde_mm256_and_si256(spsc_words(p, static_cast(readable)), spsc_w0_mask()), + spsc_half(c), + c.tail, + dst); +@@ -495,9 +501,9 @@ + template + inline bool spsc_run4(const uint32_t* p) { + static_assert(F.words == 2); +- const __m256i v = _mm256_loadu_si256(reinterpret_cast(p)); +- const __m256i c = _mm256_cmpeq_epi64(_mm256_and_si256(v, spsc_qw_type_mask()), spsc_qw_type(F.type)); +- return _mm256_testc_si256(c, _mm256_cmpeq_epi64(c, c)); ++ const simde__m256i v = simde_mm256_loadu_si256(reinterpret_cast(p)); ++ const simde__m256i c = simde_mm256_cmpeq_epi64(simde_mm256_and_si256(v, spsc_qw_type_mask()), spsc_qw_type(F.type)); ++ return simde_mm256_testc_si256(c, simde_mm256_cmpeq_epi64(c, c)); + } + + // noinline on both block kernels: called once per run, and inlined into the walk they share its register file and +@@ -521,45 +527,43 @@ + constexpr uint32_t kBlockRecs = kLoads * R; + constexpr uint32_t kFullAvail = kBlockWords - kStride + 8; // every load of the block whole + SpscBlockResult out{0, 0, 0, 0, 0}; +- const __m256i type_mask = spsc_dw_type_mask(); +- const __m256i ftype = spsc_dw_type(F.type); +- const __m256i lanes_w0 = spsc_lanes_at(); +- const __m256i lane_0 = spsc_lane0(); +- const __m256i lane_3 = _mm256_setr_epi32(0, 0, 0, -1, 0, 0, 0, 0); +- const __m256i w0_mask = spsc_w0_mask(); +- const __m256i ones = _mm256_set1_epi32(-1); +- const __m256i half = spsc_half(c); +- const __m128i tail = c.tail; +- const __m256i z = _mm256_setzero_si256(); ++ const simde__m256i type_mask = spsc_dw_type_mask(); ++ const simde__m256i ftype = spsc_dw_type(F.type); ++ const simde__m256i lanes_w0 = spsc_lanes_at(); ++ const simde__m256i lane_0 = spsc_lane0(); ++ const simde__m256i lane_3 = simde_mm256_setr_epi32(0, 0, 0, -1, 0, 0, 0, 0); ++ const simde__m256i w0_mask = spsc_w0_mask(); ++ const simde__m256i ones = simde_mm256_set1_epi32(-1); ++ const simde__m256i half = spsc_half(c); ++ const simde__m128i tail = c.tail; ++ const simde__m256i z = simde_mm256_setzero_si256(); + const uint64_t th_hi = c.th_hi; + const uint32_t* const p0 = p; +- const __m256i stall = _mm256_set1_epi32(static_cast(kSpscStallZoneId)); +- __m256i prev = z, back = z, stall_hit = z, wrap_hit = z; ++ const simde__m256i stall = simde_mm256_set1_epi32(static_cast(kSpscStallZoneId)); ++ simde__m256i prev = z, back = z, stall_hit = z, wrap_hit = z; + uint32_t total = 0; + while (max_recs != 0 && avail >= W) { + // One load at a time, stopping at the first whose records are not all F: a lone record costs one load. +- __m256i v[kLoads]; ++ simde__m256i v[kLoads]; + uint32_t n = 0; + for (uint32_t i = 0; i < kLoads; i++) { + if (avail >= kFullAvail) { +- v[i] = _mm256_loadu_si256(reinterpret_cast(p + i * kStride)); ++ v[i] = simde_mm256_loadu_si256(reinterpret_cast(p + i * kStride)); + } else { +- const __m256i mk = _mm256_cmpgt_epi32( +- _mm256_set1_epi32(static_cast(avail) - static_cast(i * kStride)), spsc_lane_idx()); +- v[i] = _mm256_maskload_epi32(reinterpret_cast(p + i * kStride), mk); ++ const simde__m256i mk = simde_mm256_cmpgt_epi32( ++ simde_mm256_set1_epi32(static_cast(avail) - static_cast(i * kStride)), spsc_lane_idx()); ++ v[i] = simde_mm256_maskload_epi32(reinterpret_cast(p + i * kStride), mk); + } +- const __m256i cm = _mm256_cmpeq_epi32(_mm256_and_si256(v[i], type_mask), ftype); +- if (!_mm256_testc_si256(cm, lanes_w0)) { ++ const simde__m256i cm = simde_mm256_cmpeq_epi32(simde_mm256_and_si256(v[i], type_mask), ftype); ++ if (!simde_mm256_testc_si256(cm, lanes_w0)) { + if constexpr (R == 2) { +- n += _mm256_testc_si256(cm, lane_0) ? 1u : 0u; ++ n += simde_mm256_testc_si256(cm, lane_0) ? 1u : 0u; + } + break; + } + n += R; + } +- if (n > max_recs) { +- n = max_recs; +- } ++ n = std::min(n, max_recs); + if (n == 0) { + break; + } +@@ -567,36 +571,39 @@ + // across loads and blocks. Lane 3 is the duration's high word when the format has one. + uint32_t i = 0; + for (; (i + 1) * R <= n; i++) { +- const __m256i l = _mm256_and_si256(v[i], w0_mask); ++ const simde__m256i l = simde_mm256_and_si256(v[i], w0_mask); + uint8_t* const o = dst + kSpscRecBytes * R * i; +- const __m256i s0 = spsc_compose(l, half, tail, o); ++ const simde__m256i s0 = spsc_compose(l, half, tail, o); + if constexpr (R == 2) { +- const __m256i s1 = spsc_compose(l, half, tail, o + kSpscRecBytes); +- back = _mm256_or_si256(back, _mm256_or_si256(_mm256_cmpgt_epi64(prev, s0), _mm256_cmpgt_epi64(s0, s1))); ++ const simde__m256i s1 = spsc_compose(l, half, tail, o + kSpscRecBytes); ++ back = simde_mm256_or_si256( ++ back, simde_mm256_or_si256(simde_mm256_cmpgt_epi64(prev, s0), simde_mm256_cmpgt_epi64(s0, s1))); + prev = s1; + if constexpr (F.has_dur_hi()) { +- wrap_hit = _mm256_or_si256( +- wrap_hit, _mm256_or_si256(_mm256_cmpeq_epi32(s0, ones), _mm256_cmpeq_epi32(s1, ones))); ++ wrap_hit = simde_mm256_or_si256( ++ wrap_hit, ++ simde_mm256_or_si256(simde_mm256_cmpeq_epi32(s0, ones), simde_mm256_cmpeq_epi32(s1, ones))); + } + } else { +- back = _mm256_or_si256(back, _mm256_cmpgt_epi64(prev, s0)); ++ back = simde_mm256_or_si256(back, simde_mm256_cmpgt_epi64(prev, s0)); + prev = s0; + if constexpr (F.has_dur_hi()) { +- wrap_hit = _mm256_or_si256(wrap_hit, _mm256_cmpeq_epi32(s0, ones)); ++ wrap_hit = simde_mm256_or_si256(wrap_hit, simde_mm256_cmpeq_epi32(s0, ones)); + } + } +- stall_hit = _mm256_or_si256(stall_hit, _mm256_cmpeq_epi32(l, stall)); ++ stall_hit = simde_mm256_or_si256(stall_hit, simde_mm256_cmpeq_epi32(l, stall)); + } + if constexpr (R == 2) { + if (2 * i < n) { // an odd last record: the load's second record is not ours +- const __m256i l = _mm256_and_si256(v[i], w0_mask); +- const __m256i s0 = spsc_compose(l, half, tail, dst + kSpscRecBytes * 2 * i); +- back = _mm256_or_si256(back, _mm256_cmpgt_epi64(prev, s0)); ++ const simde__m256i l = simde_mm256_and_si256(v[i], w0_mask); ++ const simde__m256i s0 = spsc_compose(l, half, tail, dst + kSpscRecBytes * 2 * i); ++ back = simde_mm256_or_si256(back, simde_mm256_cmpgt_epi64(prev, s0)); + prev = s0; + if constexpr (F.has_dur_hi()) { +- wrap_hit = _mm256_or_si256(wrap_hit, _mm256_cmpeq_epi32(s0, ones)); ++ wrap_hit = simde_mm256_or_si256(wrap_hit, simde_mm256_cmpeq_epi32(s0, ones)); + } +- stall_hit = _mm256_or_si256(stall_hit, _mm256_and_si256(_mm256_cmpeq_epi32(l, stall), lane_0)); ++ stall_hit = ++ simde_mm256_or_si256(stall_hit, simde_mm256_and_si256(simde_mm256_cmpeq_epi32(l, stall), lane_0)); + } + } + total += n; +@@ -612,11 +619,11 @@ + if (total != 0) { + out.ts_last = spsc_ts_at(p0, total - 1u, th_hi); + } +- out.regress = _mm256_testz_si256(back, lane_0) ? 0u : 1u; ++ out.regress = simde_mm256_testz_si256(back, lane_0) ? 0u : 1u; + if constexpr (F.has_dur_hi()) { +- out.wrapped = _mm256_testz_si256(wrap_hit, lane_3) ? 0u : 1u; ++ out.wrapped = simde_mm256_testz_si256(wrap_hit, lane_3) ? 0u : 1u; + } +- if (__builtin_expect(!_mm256_testz_si256(stall_hit, lanes_w0), 0)) { ++ if (__builtin_expect(!simde_mm256_testz_si256(stall_hit, lanes_w0), 0)) { + for (uint32_t k = 0; k < total; k++) { + out.stalls += (p0[W * k] & 0x07FFFFFFu) == kSpscStallZoneId ? 1u : 0u; + } +@@ -638,49 +645,51 @@ + constexpr bool kDelta = F.delta16; + static_assert(kDelta ? F.kind == Kind::Zone : (F.kind == Kind::Point && F.ts_lo == 1)); + SpscBlockResult out{0, 0, 0, 0, 0}; +- const __m256i type_mask = spsc_qw_type_mask(); +- const __m256i ftype = spsc_qw_type(F.type); +- const __m256i z = _mm256_setzero_si256(); +- const __m256i id_mask = _mm256_set1_epi64x(0x07FFFFFF); +- const __m256i dur_mask = _mm256_set1_epi64x(0xFFFF); +- const __m256i mv = c.mv, coords = c.coords_v; +- const __m128i tail = c.tail; ++ const simde__m256i type_mask = spsc_qw_type_mask(); ++ const simde__m256i ftype = spsc_qw_type(F.type); ++ const simde__m256i z = simde_mm256_setzero_si256(); ++ const simde__m256i id_mask = simde_mm256_set1_epi64x(0x07FFFFFF); ++ const simde__m256i dur_mask = simde_mm256_set1_epi64x(0xFFFF); ++ const simde__m256i mv = c.mv, coords = c.coords_v; ++ const simde__m128i tail = c.tail; + // The cursor rides as a broadcast vector: the next block's starts need it as one, and the block total is already + // a broadcast lane of the carry tree. +- __m256i cv = _mm256_set1_epi64x(static_cast(cursor)); +- __m256i carry = z, back = z; ++ simde__m256i cv = simde_mm256_set1_epi64x(static_cast(cursor)); ++ simde__m256i carry = z, back = z; + uint32_t total = 0; + while (max_recs != 0 && readable >= 2u) { +- __m256i v[4]; ++ simde__m256i v[4]; + if (readable >= 32u) { + for (int i = 0; i < 4; i++) { +- v[i] = _mm256_loadu_si256(reinterpret_cast(p + 8 * i)); ++ v[i] = simde_mm256_loadu_si256(reinterpret_cast(p + 8 * i)); + } + } else { + // Whole records only: a trailing odd word is never F, so its lane reads as zero and ends the scan. + const int recs = static_cast(readable / 2u); + for (int i = 0; i < 4; i++) { +- const __m256i m = _mm256_cmpgt_epi64(_mm256_set1_epi64x(recs - 4 * i), _mm256_setr_epi64x(0, 1, 2, 3)); +- v[i] = _mm256_maskload_epi64(reinterpret_cast(p + 8 * i), m); ++ const simde__m256i m = ++ simde_mm256_cmpgt_epi64(simde_mm256_set1_epi64x(recs - 4 * i), simde_mm256_setr_epi64x(0, 1, 2, 3)); ++ v[i] = simde_mm256_maskload_epi64(reinterpret_cast(p + 8 * i), m); + } + } + if constexpr (kDelta) { + // Both lines of the block four blocks ahead: the hardware prefetcher does not run far enough into + // DMA-landed memory (-6%); farther ahead evicts before use once the sink's output stream shares L1, and + // one line per block leaves every other line to the hardware. +- _mm_prefetch(reinterpret_cast(p + 128), _MM_HINT_T0); +- _mm_prefetch(reinterpret_cast(p + 144), _MM_HINT_T0); ++ simde_mm_prefetch(reinterpret_cast(p + 128), SIMDE_MM_HINT_T0); ++ simde_mm_prefetch(reinterpret_cast(p + 144), SIMDE_MM_HINT_T0); + } + uint32_t n = 0; +- for (int i = 0; i < 4; i++) { +- const __m256i cm = _mm256_cmpeq_epi64(_mm256_and_si256(v[i], type_mask), ftype); ++ for (const auto& value : v) { ++ const simde__m256i cm = simde_mm256_cmpeq_epi64(simde_mm256_and_si256(value, type_mask), ftype); + if constexpr (!kDelta) { + // Timestamps as zero-extended qwords against the record before (`carry`: the previous load's + // last); only F lanes count. +- const __m256i ts = _mm256_srli_epi64(v[i], 32); +- const __m256i before = _mm256_blend_epi32(_mm256_permute4x64_epi64(ts, 0x90), carry, 0x03); +- back = _mm256_or_si256(back, _mm256_and_si256(_mm256_cmpgt_epi64(before, ts), cm)); +- carry = _mm256_permute4x64_epi64(ts, 0xFF); ++ const simde__m256i ts = simde_mm256_srli_epi64(value, 32); ++ const simde__m256i before = ++ simde_mm256_blend_epi32(simde_mm256_permute4x64_epi64(ts, 0x90), carry, 0x03); ++ back = simde_mm256_or_si256(back, simde_mm256_and_si256(simde_mm256_cmpgt_epi64(before, ts), cm)); ++ carry = simde_mm256_permute4x64_epi64(ts, 0xFF); + } + const uint32_t k = spsc_quad_count(cm); + n += k; +@@ -688,37 +697,36 @@ + break; + } + } +- if (n > max_recs) { +- n = max_recs; +- } ++ n = std::min(n, max_recs); + if (n == 0) { + break; + } + // Inclusive prefix of the end deltas (each qword's top 16 bits) in record order: the four quads' in-lane + // prefixes are independent and their totals carry as a tree, so no dependency chain spans the block. +- __m256i pfx[4]; ++ simde__m256i pfx[4]; + if constexpr (kDelta) { + for (int i = 0; i < 4; i++) { +- __m256i d = _mm256_srli_epi64(v[i], 48); +- d = _mm256_add_epi64(d, _mm256_slli_si256(d, 8)); +- pfx[i] = _mm256_add_epi64(d, _mm256_blend_epi32(_mm256_permute4x64_epi64(d, 0x55), z, 0x0F)); +- } +- const __m256i c1 = _mm256_permute4x64_epi64(pfx[0], 0xFF); +- const __m256i c2 = _mm256_add_epi64(c1, _mm256_permute4x64_epi64(pfx[1], 0xFF)); +- const __m256i c3 = _mm256_add_epi64(c2, _mm256_permute4x64_epi64(pfx[2], 0xFF)); +- pfx[1] = _mm256_add_epi64(pfx[1], c1); +- pfx[2] = _mm256_add_epi64(pfx[2], c2); +- pfx[3] = _mm256_add_epi64(pfx[3], c3); ++ simde__m256i d = simde_mm256_srli_epi64(v[i], 48); ++ d = simde_mm256_add_epi64(d, simde_mm256_slli_si256(d, 8)); ++ pfx[i] = ++ simde_mm256_add_epi64(d, simde_mm256_blend_epi32(simde_mm256_permute4x64_epi64(d, 0x55), z, 0x0F)); ++ } ++ const simde__m256i c1 = simde_mm256_permute4x64_epi64(pfx[0], 0xFF); ++ const simde__m256i c2 = simde_mm256_add_epi64(c1, simde_mm256_permute4x64_epi64(pfx[1], 0xFF)); ++ const simde__m256i c3 = simde_mm256_add_epi64(c2, simde_mm256_permute4x64_epi64(pfx[2], 0xFF)); ++ pfx[1] = simde_mm256_add_epi64(pfx[1], c1); ++ pfx[2] = simde_mm256_add_epi64(pfx[2], c2); ++ pfx[3] = simde_mm256_add_epi64(pfx[3], c3); + } + for (uint32_t i = 0; i < 4 && 4 * i < n; i++) { + if constexpr (kDelta) { +- const __m256i d64 = _mm256_and_si256(_mm256_srli_epi64(v[i], 32), dur_mask); +- const __m256i s64 = _mm256_sub_epi64(_mm256_add_epi64(cv, pfx[i]), d64); +- const __m256i m64 = _mm256_or_si256(_mm256_and_si256(v[i], id_mask), mv); ++ const simde__m256i d64 = simde_mm256_and_si256(simde_mm256_srli_epi64(v[i], 32), dur_mask); ++ const simde__m256i s64 = simde_mm256_sub_epi64(simde_mm256_add_epi64(cv, pfx[i]), d64); ++ const simde__m256i m64 = simde_mm256_or_si256(simde_mm256_and_si256(v[i], id_mask), mv); + spsc_store_quad(dst + 4 * kSpscRecBytes * i, s64, d64, m64, coords, tail); + } else { +- const __m256i ts64 = _mm256_or_si256(_mm256_srli_epi64(v[i], 32), c.tv); +- const __m256i m64 = _mm256_or_si256(_mm256_and_si256(v[i], id_mask), mv); ++ const simde__m256i ts64 = simde_mm256_or_si256(simde_mm256_srli_epi64(v[i], 32), c.tv); ++ const simde__m256i m64 = simde_mm256_or_si256(simde_mm256_and_si256(v[i], id_mask), mv); + spsc_store_quad(dst + 4 * kSpscRecBytes * i, ts64, z, m64, coords, tail); + } + } +@@ -730,16 +738,17 @@ + // to hot stack. + alignas(32) uint64_t arr[16]; + for (int i = 0; i < 4; i++) { +- _mm256_store_si256(reinterpret_cast<__m256i*>(arr + 4 * i), pfx[i]); ++ simde_mm256_store_si256(reinterpret_cast(arr + 4 * i), pfx[i]); + } +- out.ts_last = static_cast(_mm_cvtsi128_si64(_mm256_castsi256_si128(cv))) + arr[n - 1]; ++ out.ts_last = ++ static_cast(simde_mm_cvtsi128_si64(simde_mm256_castsi256_si128(cv))) + arr[n - 1]; + out.n = total; + return out; // the block ended on a non-F word or the emit budget + } +- cv = _mm256_add_epi64(cv, _mm256_permute4x64_epi64(pfx[3], 0xFF)); ++ cv = simde_mm256_add_epi64(cv, simde_mm256_permute4x64_epi64(pfx[3], 0xFF)); + } else { + // The carry for the next block is this block's last record, which the load loop may have run past. +- carry = _mm256_set1_epi64x(static_cast(p[2u * n - 1u])); ++ carry = simde_mm256_set1_epi64x(static_cast(p[2u * n - 1u])); + out.ts_last = c.th_hi | p[2u * n - 1u]; + if (n < 16u) { + break; +@@ -752,10 +761,10 @@ + out.n = total; + if constexpr (kDelta) { + if (total != 0) { +- out.ts_last = static_cast(_mm_cvtsi128_si64(_mm256_castsi256_si128(cv))); ++ out.ts_last = static_cast(simde_mm_cvtsi128_si64(simde_mm256_castsi256_si128(cv))); + } + } else { +- out.regress = _mm256_testz_si256(back, back) ? 0u : 1u; ++ out.regress = simde_mm256_testz_si256(back, back) ? 0u : 1u; + } + return out; + } +@@ -783,37 +792,38 @@ + constexpr int kPayload = kSpscDataFormat.words; + const uint32_t elems = (n + 1u) >> 1; + uint64_t* const pay = reinterpret_cast(dst + kSpscRecBytes); +- const __m256i lane_idx = spsc_lane_idx(); ++ const simde__m256i lane_idx = spsc_lane_idx(); + // The head and payload words 0-4 of the packet, the payload lanes zeroed past the count and past readable. + const uint32_t words = std::min(readable, static_cast(kPayload) + n); +- const __m256i l = _mm256_maskload_epi32( +- reinterpret_cast(p), _mm256_cmpgt_epi32(_mm256_set1_epi32(static_cast(words)), lane_idx)); +- const __m256i head = _mm256_blend_epi32( +- _mm256_blend_epi32( +- _mm256_permutevar8x32_epi32( +- _mm256_and_si256(l, _mm256_setr_epi32(0x07FFFFFF, -1, -1, -1, -1, -1, -1, -1)), +- _mm256_setr_epi32(kTs, 0, 0, 0, 0, 0, 0, 0)), ++ const simde__m256i l = simde_mm256_maskload_epi32( ++ reinterpret_cast(p), ++ simde_mm256_cmpgt_epi32(simde_mm256_set1_epi32(static_cast(words)), lane_idx)); ++ const simde__m256i head = simde_mm256_blend_epi32( ++ simde_mm256_blend_epi32( ++ simde_mm256_permutevar8x32_epi32( ++ simde_mm256_and_si256(l, simde_mm256_setr_epi32(0x07FFFFFF, -1, -1, -1, -1, -1, -1, -1)), ++ simde_mm256_setr_epi32(kTs, 0, 0, 0, 0, 0, 0, 0)), + c.point_half, + 0xEE), +- _mm256_set1_epi64x(static_cast(elems)), ++ simde_mm256_set1_epi64x(static_cast(elems)), + 0x0C); +- _mm256_storeu_si256(reinterpret_cast<__m256i*>(dst), head); +- _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + 32), c.tail); ++ simde_mm256_storeu_si256(reinterpret_cast(dst), head); ++ simde_mm_storeu_si128(reinterpret_cast(dst + 32), c.tail); + // Elements 0-1 from the packet's first four payload words, high word first. +- _mm256_storeu_si256( +- reinterpret_cast<__m256i*>(pay), +- _mm256_permutevar8x32_epi32( +- l, _mm256_setr_epi32(kPayload + 1, kPayload, kPayload + 3, kPayload + 2, 0, 0, 0, 0))); ++ simde_mm256_storeu_si256( ++ reinterpret_cast(pay), ++ simde_mm256_permutevar8x32_epi32( ++ l, simde_mm256_setr_epi32(kPayload + 1, kPayload, kPayload + 3, kPayload + 2, 0, 0, 0, 0))); + if (__builtin_expect(n > 4u, 0)) { + const uint32_t pw = readable > static_cast(kPayload) ? std::min(readable - kPayload, n) : 0u; + for (uint32_t k = 4; k < n; k += 8) { + const uint32_t left = std::min(n - k, pw > k ? pw - k : 0u); +- const __m256i pl = _mm256_maskload_epi32( ++ const simde__m256i pl = simde_mm256_maskload_epi32( + reinterpret_cast(p + kPayload + k), +- _mm256_cmpgt_epi32(_mm256_set1_epi32(static_cast(left)), lane_idx)); +- _mm256_storeu_si256( +- reinterpret_cast<__m256i*>(pay + k / 2), +- _mm256_permutevar8x32_epi32(pl, _mm256_setr_epi32(1, 0, 3, 2, 5, 4, 7, 6))); ++ simde_mm256_cmpgt_epi32(simde_mm256_set1_epi32(static_cast(left)), lane_idx)); ++ simde_mm256_storeu_si256( ++ reinterpret_cast(pay + k / 2), ++ simde_mm256_permutevar8x32_epi32(pl, simde_mm256_setr_epi32(1, 0, 3, 2, 5, 4, 7, 6))); + } + } + return elems; diff --git a/pkgs/by-name/tt/tt-smi/package.nix b/pkgs/by-name/tt/tt-smi/package.nix index 69e4e2d652da..98a7de43b4ce 100644 --- a/pkgs/by-name/tt/tt-smi/package.nix +++ b/pkgs/by-name/tt/tt-smi/package.nix @@ -36,7 +36,10 @@ python3Packages.buildPythonApplication (finalAttrs: { tt-umd ]; - pythonRelaxDeps = [ "tt-umd" ]; + pythonRelaxDeps = [ + "tt-umd" + "pyluwen" + ]; nativeCheckInputs = [ versionCheckHook ]; diff --git a/pkgs/by-name/tt/tt-umd/fix-targets.patch b/pkgs/by-name/tt/tt-umd/fix-targets.patch deleted file mode 100644 index df35f4d8a650..000000000000 --- a/pkgs/by-name/tt/tt-umd/fix-targets.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt -index 96d71990..1db71f88 100644 ---- a/third_party/CMakeLists.txt -+++ b/third_party/CMakeLists.txt -@@ -43,6 +43,7 @@ CPMAddPackage( - "YAML_CPP_BUILD_TESTS OFF" - "YAML_CPP_BUILD_TOOLS OFF" - "YAML_BUILD_SHARED_LIBS OFF" -+ FIND_PACKAGE_ARGUMENTS GLOBAL - ) - - if(yaml-cpp_ADDED) -@@ -146,7 +147,13 @@ CPMAddPackage( - #################################################################################################################### - # tt-logger - #################################################################################################################### --CPMAddPackage(NAME tt-logger GITHUB_REPOSITORY tenstorrent/tt-logger VERSION 1.1.8 SYSTEM YES) -+CPMAddPackage( -+ NAME tt-logger -+ GITHUB_REPOSITORY tenstorrent/tt-logger -+ VERSION 1.1.8 -+ SYSTEM YES -+ FIND_PACKAGE_ARGUMENTS GLOBAL -+) - - #################################################################################################################### - # cxxopts -@@ -159,6 +166,7 @@ CPMAddPackage( - SYSTEM YES - OPTIONS - "CMAKE_MESSAGE_LOG_LEVEL NOTICE" -+ FIND_PACKAGE_ARGUMENTS GLOBAL - ) - - #################################################################################################################### diff --git a/pkgs/by-name/tt/tt-umd/link-shared-yaml-cpp-into-baremetal-tests.patch b/pkgs/by-name/tt/tt-umd/link-shared-yaml-cpp-into-baremetal-tests.patch new file mode 100644 index 000000000000..7061cce25b50 --- /dev/null +++ b/pkgs/by-name/tt/tt-umd/link-shared-yaml-cpp-into-baremetal-tests.patch @@ -0,0 +1,24 @@ +From da577871393fe65710d2040944e5610507e11dfd Mon Sep 17 00:00:00 2001 +From: liberodark +Date: Sat, 3 Oct 2026 12:39:45 +0200 +Subject: [PATCH] Link a shared yaml-cpp into baremetal_tests + +--- + tests/baremetal/CMakeLists.txt | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/tests/baremetal/CMakeLists.txt b/tests/baremetal/CMakeLists.txt +index 0971048ecaca13ae2438ca4905dc0d2ccf8ddaa5..6d417739360305c8467b581931cb830d3553b155 100644 +--- a/tests/baremetal/CMakeLists.txt ++++ b/tests/baremetal/CMakeLists.txt +@@ -33,6 +33,10 @@ target_link_libraries(baremetal_tests PRIVATE test_common) + # the library would place a second copy of it in this binary beside the one already inside + # libtt-umd.so, which ASan reports as an ODR violation on YAML::Exception's typeinfo. + target_include_directories(baremetal_tests PRIVATE $) ++get_target_property(YAML_CPP_TYPE yaml-cpp::yaml-cpp TYPE) ++if(YAML_CPP_TYPE STREQUAL "SHARED_LIBRARY") ++ target_link_libraries(baremetal_tests PRIVATE yaml-cpp::yaml-cpp) ++endif() + if(TT_UMD_BUILD_EMULE) + target_sources(baremetal_tests PRIVATE test_sw_emule_chip.cpp) + target_link_libraries(baremetal_tests PRIVATE tt-emule::headers) diff --git a/pkgs/by-name/tt/tt-umd/package.nix b/pkgs/by-name/tt/tt-umd/package.nix index 23b2e44c2cf8..09370f83a208 100644 --- a/pkgs/by-name/tt/tt-umd/package.nix +++ b/pkgs/by-name/tt/tt-umd/package.nix @@ -18,7 +18,7 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "tt-umd"; - version = "0.9.6"; + version = "0.9.12"; __structuredAttrs = true; strictDeps = true; @@ -31,7 +31,7 @@ stdenv.mkDerivation (finalAttrs: { owner = "tenstorrent"; repo = "tt-umd"; tag = "v${finalAttrs.version}"; - hash = "sha256-3IrgsKRaJP/rEXiMvi2LnzS9n2+Giu5d05RohzRgPw4="; + hash = "sha256-lhcNZuCV8n3ebbUU1MveZXR49qaybmOiSTLpitG96/s="; }; cpm = fetchurl { @@ -40,8 +40,8 @@ stdenv.mkDerivation (finalAttrs: { }; patches = [ - # https://github.com/tenstorrent/tt-umd/pull/2187 - ./fix-targets.patch + # https://github.com/tenstorrent/tt-umd/pull/3593 + ./link-shared-yaml-cpp-into-baremetal-tests.patch ]; postPatch = '' @@ -82,6 +82,7 @@ stdenv.mkDerivation (finalAttrs: { (lib.cmakeBool "TT_UMD_BUILD_TESTS" finalAttrs.finalPackage.doCheck) (lib.cmakeBool "TT_UMD_BUILD_STATIC" stdenv.hostPlatform.isStatic) (lib.cmakeBool "TT_UMD_BUILD_PYTHON" true) + (lib.cmakeBool "CMAKE_COMPILE_WARNING_AS_ERROR" false) (lib.cmakeFeature "nanobind_DIR" "${python3.pkgs.nanobind}/${python3.sitePackages}/nanobind/cmake") ]; diff --git a/pkgs/by-name/un/unscd/package.nix b/pkgs/by-name/un/unscd/package.nix index d0dc26fe72dd..205f0c695bd4 100644 --- a/pkgs/by-name/un/unscd/package.nix +++ b/pkgs/by-name/un/unscd/package.nix @@ -2,7 +2,7 @@ fetchurl, fetchpatch, stdenv, - systemd, + systemdLibs, lib, }: @@ -53,7 +53,7 @@ stdenv.mkDerivation rec { ./0001-adjust-socket-paths-for-nixos.patch ]; - buildInputs = [ systemd ]; + buildInputs = [ systemdLibs ]; buildPhase = '' runHook preBuild diff --git a/pkgs/by-name/up/upx/package.nix b/pkgs/by-name/up/upx/package.nix index b5d602ca9f83..747e1dee1626 100644 --- a/pkgs/by-name/up/upx/package.nix +++ b/pkgs/by-name/up/upx/package.nix @@ -9,13 +9,13 @@ stdenv.mkDerivation (finalAttrs: { pname = "upx"; - version = "5.2.0"; + version = "5.2.1"; src = fetchFromGitHub { owner = "upx"; repo = "upx"; tag = "v${finalAttrs.version}"; fetchSubmodules = true; - hash = "sha256-6LTDz4gMak0V7KiZOeuQgm+RubKRp3zhF6T6SZzZ5Dk="; + hash = "sha256-Fy+BqntQcHLo5FGhWTP6gqe5OIGC6w7SMc+tlV+VqCM="; }; nativeBuildInputs = [ cmake ]; diff --git a/pkgs/by-name/uv/uv/package.nix b/pkgs/by-name/uv/uv/package.nix index 1389fa027df6..640e72e67a57 100644 --- a/pkgs/by-name/uv/uv/package.nix +++ b/pkgs/by-name/uv/uv/package.nix @@ -18,17 +18,17 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "uv"; - version = "0.12.17"; + version = "0.12.22"; __structuredAttrs = true; src = fetchFromGitHub { owner = "astral-sh"; repo = "uv"; tag = finalAttrs.version; - hash = "sha256-e/AA9/Uou8c1usaVxGc/kzHSo5bzJOmupWOGk7L8+KI="; + hash = "sha256-lgGB9kO3+xnm1Tob+PflpiZRLW7a6Gvim3qVKc6JceY="; }; - cargoHash = "sha256-6AKm5l3snX1gmN5uAp0N9NVFd0nPBdtHz8WwZiFoYPU="; + cargoHash = "sha256-IC7rbCcUf7U33pNGZRfHLeXAcTLIYJJ6iSj9LFcWIy4="; buildInputs = [ rust-jemalloc-sys diff --git a/pkgs/by-name/uw/uwsgi/package.nix b/pkgs/by-name/uw/uwsgi/package.nix index 0da10531d2ff..874fb024edc2 100644 --- a/pkgs/by-name/uw/uwsgi/package.nix +++ b/pkgs/by-name/uw/uwsgi/package.nix @@ -13,8 +13,8 @@ plugins ? [ ], pam, withPAM ? stdenv.hostPlatform.isLinux, - systemd, - withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, + systemdLibs, + withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemdLibs, libcap, withCap ? stdenv.hostPlatform.isLinux, python3, @@ -118,7 +118,7 @@ stdenv.mkDerivation (finalAttrs: { zlib ] ++ lib.optional withPAM pam - ++ lib.optional withSystemd systemd + ++ lib.optional withSystemd systemdLibs ++ lib.optional withCap libcap ++ lib.concatMap (x: x.inputs) needed; diff --git a/pkgs/by-name/wc/wcslib/package.nix b/pkgs/by-name/wc/wcslib/package.nix index 9e03e267b488..0465eef912fb 100644 --- a/pkgs/by-name/wc/wcslib/package.nix +++ b/pkgs/by-name/wc/wcslib/package.nix @@ -7,11 +7,11 @@ stdenv.mkDerivation (finalAttrs: { pname = "wcslib"; - version = "8.9"; + version = "8.10"; src = fetchurl { url = "ftp://ftp.atnf.csiro.au/pub/software/wcslib/wcslib-${finalAttrs.version}.tar.bz2"; - hash = "sha256-gqwJzlCRsL8Gzsj1ze7B2r4dBrpd+3/yvbDBaASIgHs="; + hash = "sha256-s5TTMG2ppSQQ8FYTaRFJblmbXEjxz/LyIVY2lwd7vY0="; }; # error: call to undeclared library function 'snprintf' diff --git a/pkgs/by-name/xb/xbyak/package.nix b/pkgs/by-name/xb/xbyak/package.nix index 29bf13f167c4..d878585d5c1b 100644 --- a/pkgs/by-name/xb/xbyak/package.nix +++ b/pkgs/by-name/xb/xbyak/package.nix @@ -6,13 +6,13 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "xbyak"; - version = "7.42"; + version = "7.43"; src = fetchFromGitHub { owner = "herumi"; repo = "xbyak"; tag = "v${finalAttrs.version}"; - hash = "sha256-GwsHEjqUBExb4pIZ6Z6YWGka0Fx3Qby4YYG0Otm6OAw="; + hash = "sha256-y4RhUuKMJgcG+NaQxhUn+7v2pHo8wfsd/AYjJEUtXR4="; }; nativeBuildInputs = [ cmake ]; diff --git a/pkgs/by-name/xc/xcaddy/inject_version_info.diff b/pkgs/by-name/xc/xcaddy/inject_version_info.diff deleted file mode 100644 index 4d87aa687878..000000000000 --- a/pkgs/by-name/xc/xcaddy/inject_version_info.diff +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/cmd/main.go b/cmd/main.go -index ede7cd8..c553140 100644 ---- a/cmd/main.go -+++ b/cmd/main.go -@@ -401,8 +401,11 @@ func splitWith(arg string) (module, version, replace string, err error) { - return - } - -+var customVersion string -+ - // xcaddyVersion returns a detailed version string, if available. - func xcaddyVersion() string { -+ return customVersion - mod := goModule() - ver := mod.Version - if mod.Sum != "" { diff --git a/pkgs/by-name/xc/xcaddy/package.nix b/pkgs/by-name/xc/xcaddy/package.nix index c73018fc6f83..2bbe2ff01cec 100644 --- a/pkgs/by-name/xc/xcaddy/package.nix +++ b/pkgs/by-name/xc/xcaddy/package.nix @@ -2,38 +2,39 @@ lib, buildGoModule, fetchFromGitHub, + versionCheckHook, }: buildGoModule (finalAttrs: { pname = "xcaddy"; - version = "0.4.6"; + version = "0.4.7"; + + __structuredAttrs = true; subPackages = [ "cmd/xcaddy" ]; src = fetchFromGitHub { owner = "caddyserver"; repo = "xcaddy"; - rev = "v${finalAttrs.version}"; - hash = "sha256-SXCOKrGaTwcdrVhPenQGjdBaDl8/bUGmm1B3spk8eUA="; + tag = "v${finalAttrs.version}"; + hash = "sha256-q69Ey6gf/Uyui9x3nKkGFHiwTpMB0N3ix89JLgTsR1A="; }; - patches = [ - ./inject_version_info.diff - ./use_tmpdir_on_darwin.diff - ]; - ldflags = [ "-s" - "-w" - "-X github.com/caddyserver/xcaddy/cmd.customVersion=v${finalAttrs.version}" + "-X github.com/caddyserver/xcaddy/cmd.CustomVersion=v${finalAttrs.version}" ]; - vendorHash = "sha256-K5+Gj4Lqla6q9vx95BtCS67mZMWkMjgIHVYpBUdx/Wc="; + vendorHash = "sha256-bZs+2XrwVwfJdNLBZk6FPNi26ctVQ82ywesEU0o5Gkc="; + + doInstallCheck = true; + nativeInstallCheckInputs = [ versionCheckHook ]; meta = { homepage = "https://github.com/caddyserver/xcaddy"; description = "Build Caddy with plugins"; mainProgram = "xcaddy"; license = lib.licenses.asl20; + maintainers = [ lib.maintainers.stepbrobd ]; }; }) diff --git a/pkgs/by-name/xc/xcaddy/use_tmpdir_on_darwin.diff b/pkgs/by-name/xc/xcaddy/use_tmpdir_on_darwin.diff deleted file mode 100644 index 064d8feb5a05..000000000000 --- a/pkgs/by-name/xc/xcaddy/use_tmpdir_on_darwin.diff +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/builder.go b/builder.go -index ed6c5ef..36e8055 100644 ---- a/builder.go -+++ b/builder.go -@@ -200,7 +200,7 @@ func NewReplace(old, new string) Replace { - // It is the caller's responsibility to remove the folder when finished. - func newTempFolder() (string, error) { - var parentDir string -- if runtime.GOOS == "darwin" { -+ if false && runtime.GOOS == "darwin" { - // After upgrading to macOS High Sierra, Caddy builds mysteriously - // started missing the embedded version information that -ldflags - // was supposed to produce. But it only happened on macOS after diff --git a/pkgs/by-name/xd/xdg-desktop-portal-generic/package.nix b/pkgs/by-name/xd/xdg-desktop-portal-generic/package.nix index 7a6bacc82372..2b34dd9dbd8f 100644 --- a/pkgs/by-name/xd/xdg-desktop-portal-generic/package.nix +++ b/pkgs/by-name/xd/xdg-desktop-portal-generic/package.nix @@ -11,13 +11,13 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "xdg-desktop-portal-generic"; - version = "0.9.0"; + version = "1.0.0"; src = fetchFromGitHub { owner = "lamco-admin"; repo = "xdg-desktop-portal-generic"; rev = "v${finalAttrs.version}"; - hash = "sha256-gwTEIW/1qaT+uDI1zJQIndM01FmQcYHDYWR98+jT0uI="; + hash = "sha256-YuwIaPA2E1QtSVz4mwteDEaZEBwaUoYLdfArGsJqHn0="; }; __structuredAttrs = true; @@ -31,7 +31,7 @@ rustPlatform.buildRustPackage (finalAttrs: { --replace-fail '/usr/libexec/' '${placeholder "out"}/libexec/' ''; - cargoHash = "sha256-6fD4Bxkx5W3CqB6m8+QlTFZJ7l+wC17VpLhLNr4ZjIw="; + cargoHash = "sha256-EVmHmeoh1THLRrqn3v1WjvHNxBFopdCz3n5C4eOBrNg="; nativeBuildInputs = [ pkg-config diff --git a/pkgs/development/python-modules/altcha/default.nix b/pkgs/development/python-modules/altcha/default.nix index e00bd56512b0..4d8fe5ad3dd3 100644 --- a/pkgs/development/python-modules/altcha/default.nix +++ b/pkgs/development/python-modules/altcha/default.nix @@ -8,14 +8,14 @@ buildPythonPackage (finalAttrs: { pname = "altcha"; - version = "2.1.0"; + version = "2.2.0"; pyproject = true; src = fetchFromGitHub { owner = "altcha-org"; repo = "altcha-lib-py"; tag = "v${finalAttrs.version}"; - hash = "sha256-GPHmyt+5a/sGVt2ZwsWON1xkwNhYcmb3PShILiOhaoM="; + hash = "sha256-Lg28eGXVTwt8L/3fUZw/9Gn5BObM30YtJdLEaDt56Gc="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/bitsandbytes/default.nix b/pkgs/development/python-modules/bitsandbytes/default.nix index 3803a930476d..cdfe52f85815 100644 --- a/pkgs/development/python-modules/bitsandbytes/default.nix +++ b/pkgs/development/python-modules/bitsandbytes/default.nix @@ -40,18 +40,21 @@ let # NOTE: torchvision doesn't use cudnn; torch does! # For this reason it is not included. - cuda-common-redist = with cudaPackages; [ - (lib.getDev cccl) # - (lib.getDev libcublas) # cublas_v2.h - (lib.getLib libcublas) - (lib.getInclude libcublas) # cublasLt.h - libcurand - libcusolver # cusolverDn.h - (lib.getDev libcusparse) # cusparse.h - (lib.getLib libcusparse) # cusparse.h - (lib.getInclude libcusparse) # cusparse.h - (lib.getDev cuda_cudart) # cuda_runtime.h cuda_runtime_api.h - ]; + cuda-common-redist = + with cudaPackages; + [ + (lib.getDev cccl) # + (lib.getDev libcublas) # cublas_v2.h + (lib.getLib libcublas) + (lib.getInclude libcublas) # cublasLt.h + libcurand + libcusolver # cusolverDn.h + (lib.getDev libcusparse) # cusparse.h + (lib.getLib libcusparse) # cusparse.h + (lib.getInclude libcusparse) # cusparse.h + (lib.getDev cuda_cudart) # cuda_runtime.h cuda_runtime_api.h + ] + ++ lib.optionals cudaPackages.cuda_crt.meta.available [ cuda_crt ]; cuda-native-redist = symlinkJoin { name = "cuda-native-redist-${cudaMajorMinorVersion}"; diff --git a/pkgs/development/python-modules/gdown/default.nix b/pkgs/development/python-modules/gdown/default.nix index 0aad3a559326..f7601969e3c7 100644 --- a/pkgs/development/python-modules/gdown/default.nix +++ b/pkgs/development/python-modules/gdown/default.nix @@ -16,12 +16,12 @@ buildPythonPackage (finalAttrs: { pname = "gdown"; - version = "6.2.0"; + version = "6.4.0"; pyproject = true; src = fetchPypi { inherit (finalAttrs) pname version; - hash = "sha256-C78l03YSYiY6LZ1KbLJuvH4PIlrY8TSDIJmSUIvM3FQ="; + hash = "sha256-4MkBpNhHs91IL1VucWcm+/a6yhx7BGdX2UiyR+63yCI="; }; build-system = [ diff --git a/pkgs/development/python-modules/gpuctypes/default.nix b/pkgs/development/python-modules/gpuctypes/default.nix index 8c6d8d7dfaac..e66bd124f35f 100644 --- a/pkgs/development/python-modules/gpuctypes/default.nix +++ b/pkgs/development/python-modules/gpuctypes/default.nix @@ -20,15 +20,16 @@ assert testCudaRuntime -> cudaSupport; assert testRocmRuntime -> rocmSupport; -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "gpuctypes"; version = "0.3.0"; pyproject = true; + __structuredAttrs = true; src = fetchFromGitHub { repo = "gpuctypes"; owner = "tinygrad"; - tag = version; + tag = finalAttrs.version; hash = "sha256-xUMvMBK1UhZaMZfik0Ia6+siyZGpCkBV+LTnQvzt/rw="; }; @@ -43,22 +44,29 @@ buildPythonPackage rec { }) ]; - nativeBuildInputs = [ setuptools ]; + build-system = [ setuptools ]; postPatch = '' substituteInPlace gpuctypes/opencl.py \ - --replace "ctypes.util.find_library('OpenCL')" "'${ocl-icd}/lib/libOpenCL.so'" + --replace-fail \ + "ctypes.util.find_library('OpenCL')" \ + "'${lib.getLib ocl-icd}/lib/libOpenCL.so'" '' # hipGetDevicePropertiesR0600 is a symbol from rocm-6. We are currently at rocm-5. # We are not sure that this works. Remove when rocm gets updated to version 6. + lib.optionalString rocmSupport '' substituteInPlace gpuctypes/hip.py \ - --replace "/opt/rocm/lib/libamdhip64.so" "${rocmPackages.clr}/lib/libamdhip64.so" \ - --replace "/opt/rocm/lib/libhiprtc.so" "${rocmPackages.clr}/lib/libhiprtc.so" \ - --replace "hipGetDevicePropertiesR0600" "hipGetDeviceProperties" + --replace-fail \ + "/opt/rocm/lib/libamdhip64.so" \ + "${lib.getLib rocmPackages.clr}/lib/libamdhip64.so" \ + --replace-fail \ + "hipGetDevicePropertiesR0600" \ + "hipGetDeviceProperties" substituteInPlace gpuctypes/comgr.py \ - --replace "/opt/rocm/lib/libamd_comgr.so" "${rocmPackages.rocm-comgr}/lib/libamd_comgr.so" + --replace-fail \ + "/opt/rocm/lib/libamd_comgr.so" \ + "${lib.getLib rocmPackages.rocm-comgr}/lib/libamd_comgr.so" ''; pythonImportsCheck = [ "gpuctypes" ]; @@ -112,6 +120,7 @@ buildPythonPackage rec { meta = { description = "Ctypes wrappers for HIP, CUDA, and OpenCL"; homepage = "https://github.com/tinygrad/gpuctypes"; + changelog = "https://github.com/tinygrad/gpuctypes/releases/tag/${finalAttrs.src.tag}"; license = lib.licenses.mit; maintainers = with lib.maintainers; [ GaetanLepage @@ -119,4 +128,4 @@ buildPythonPackage rec { wozeparrot ]; }; -} +}) diff --git a/pkgs/development/python-modules/jupyter-server/default.nix b/pkgs/development/python-modules/jupyter-server/default.nix index cfa5548cb5b6..68ed8b34f211 100644 --- a/pkgs/development/python-modules/jupyter-server/default.nix +++ b/pkgs/development/python-modules/jupyter-server/default.nix @@ -130,6 +130,9 @@ buildPythonPackage (finalAttrs: { # nbconvert failed: `relax_add_props` kwargs of validate has been # deprecated for security reasons, and will be removed soon. "tests/nbconvert/test_handlers.py" + # timing sensitive + "tests/services/contents/test_manager.py::test_created_timestamp" + "tests/services/kernels/test_connection.py::test_disconnect_resolves_orphaned_kernel_info_future" ]; __darwinAllowLocalNetworking = true; diff --git a/pkgs/development/python-modules/llama-index-embeddings-google-genai/default.nix b/pkgs/development/python-modules/llama-index-embeddings-google-genai/default.nix index cd877082bc9a..a8589ea91c6e 100644 --- a/pkgs/development/python-modules/llama-index-embeddings-google-genai/default.nix +++ b/pkgs/development/python-modules/llama-index-embeddings-google-genai/default.nix @@ -9,13 +9,13 @@ buildPythonPackage (finalAttrs: { pname = "llama-index-embeddings-google-genai"; - version = "0.5.1"; + version = "0.6.0"; pyproject = true; src = fetchPypi { pname = "llama_index_embeddings_google_genai"; inherit (finalAttrs) version; - hash = "sha256-xA0J65uYGUnbWaNh0yJ0U8IumOnhjTXHK9Jklnvd2UQ="; + hash = "sha256-4bdMO4Kre6aLt6xpg0Wh84NleYfRyLwfTJPBHkx+5Zw="; }; build-system = [ hatchling ]; diff --git a/pkgs/development/python-modules/pycuda/default.nix b/pkgs/development/python-modules/pycuda/default.nix index c2a3c43c9289..d05b24b45ba7 100644 --- a/pkgs/development/python-modules/pycuda/default.nix +++ b/pkgs/development/python-modules/pycuda/default.nix @@ -15,11 +15,21 @@ python, mkDerivation, lib, + symlinkJoin, }: let compyte = import ./compyte.nix { inherit mkDerivation fetchFromGitHub; }; - inherit (cudaPackages) cudatoolkit; + cudaRoot = symlinkJoin { + name = "pycuda-cuda-root"; + paths = with cudaPackages; [ + cuda_cudart + cuda_nvcc + (lib.getInclude cuda_profiler_api) + (lib.getInclude libcurand) + (lib.getLib libcurand) + ]; + }; in buildPythonPackage rec { pname = "pycuda"; @@ -36,7 +46,7 @@ buildPythonPackage rec { --boost-lib-dir=${boost}/lib \ --no-use-shipped-boost \ --boost-python-libname=boost_python${major python.version}${minor python.version} \ - --cuda-root=${cudatoolkit} + --cuda-root=${cudaRoot} ''; postInstall = '' @@ -66,7 +76,10 @@ buildPythonPackage rec { decorator appdirs six - cudatoolkit + cudaPackages.cuda_cudart + cudaPackages.cuda_nvcc + (lib.getInclude cudaPackages.cuda_profiler_api) + cudaPackages.libcurand compyte python mako diff --git a/pkgs/development/python-modules/pyluwen/default.nix b/pkgs/development/python-modules/pyluwen/default.nix index ef186683868c..8c7598fc1435 100644 --- a/pkgs/development/python-modules/pyluwen/default.nix +++ b/pkgs/development/python-modules/pyluwen/default.nix @@ -9,7 +9,7 @@ }: buildPythonPackage (finalAttrs: { pname = "pyluwen"; - version = "0.9.0"; + version = "0.10.0"; pyproject = true; __structuredAttrs = true; @@ -17,12 +17,12 @@ buildPythonPackage (finalAttrs: { owner = "tenstorrent"; repo = "luwen"; tag = "v${finalAttrs.version}"; - hash = "sha256-pc/7G9YxBTg2uYn47ONxI7zsfdK3Ex4zndLASRtDQyk="; + hash = "sha256-J0SvCBsDi3GMvnwqgqGMUDvrSO+baznDhsfuvF44Ens="; }; cargoDeps = rustPlatform.fetchCargoVendor { inherit (finalAttrs) pname version src; - hash = "sha256-2ibAZnfv++eyCB57F0uD7XFJ3MP9SnAApOn6uelo3Po="; + hash = "sha256-vEuVxBGIJAyc8POy3EPTzTK5g5SE3QDZcnTnAb3b5k0="; }; sourceRoot = "${finalAttrs.src.name}/bind/pyluwen"; diff --git a/pkgs/development/python-modules/pywbem/default.nix b/pkgs/development/python-modules/pywbem/default.nix index 8c676f9a165f..ba250cd04715 100644 --- a/pkgs/development/python-modules/pywbem/default.nix +++ b/pkgs/development/python-modules/pywbem/default.nix @@ -26,12 +26,12 @@ buildPythonPackage rec { pname = "pywbem"; - version = "1.9.0"; + version = "1.9.1"; pyproject = true; src = fetchPypi { inherit pname version; - hash = "sha256-ZcH/lyzqLwF7BnlfR8CtdEL4Q0/2Q6VEBQwQcmcE9qs="; + hash = "sha256-tTfr6DfE/W8ifHXdGWF14QW5X66a3PGfeQRXujV1M0M="; }; postPatch = '' diff --git a/pkgs/development/python-modules/rmsd/default.nix b/pkgs/development/python-modules/rmsd/default.nix index 5b752ff48fc8..716153122f61 100644 --- a/pkgs/development/python-modules/rmsd/default.nix +++ b/pkgs/development/python-modules/rmsd/default.nix @@ -10,12 +10,12 @@ buildPythonPackage rec { pname = "rmsd"; - version = "1.6.5"; + version = "1.7.0"; pyproject = true; src = fetchPypi { inherit pname version; - hash = "sha256-blEDbbrGtOz067Jq24QMBU5P8otmBwnUl8Tpjvc7TLo="; + hash = "sha256-VQz+mnootttCRJEcMA8Yx7VzmWCcdgHHSVkJ3JZXIX0="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/snakemake-interface-common/default.nix b/pkgs/development/python-modules/snakemake-interface-common/default.nix index 11eafb41897a..6d75761241a1 100644 --- a/pkgs/development/python-modules/snakemake-interface-common/default.nix +++ b/pkgs/development/python-modules/snakemake-interface-common/default.nix @@ -10,6 +10,7 @@ # dependencies argparse-dataclass, configargparse, + packaging, # tests pytestCheckHook, @@ -48,6 +49,7 @@ buildPythonPackage (finalAttrs: { dependencies = [ argparse-dataclass configargparse + packaging ]; pythonImportsCheck = [ "snakemake_interface_common" ]; diff --git a/pkgs/development/python-modules/snakemake-interface-storage-plugins/default.nix b/pkgs/development/python-modules/snakemake-interface-storage-plugins/default.nix index 8b3f8c5f94ea..51eecb1406c0 100644 --- a/pkgs/development/python-modules/snakemake-interface-storage-plugins/default.nix +++ b/pkgs/development/python-modules/snakemake-interface-storage-plugins/default.nix @@ -8,7 +8,6 @@ # dependencies humanfriendly, - reretry, snakemake-interface-common, tenacity, throttler, @@ -40,7 +39,6 @@ buildPythonPackage (finalAttrs: { dependencies = [ humanfriendly - reretry snakemake-interface-common tenacity throttler diff --git a/pkgs/development/python-modules/snakemake-storage-plugin-fs/default.nix b/pkgs/development/python-modules/snakemake-storage-plugin-fs/default.nix index 96bcb3fc30fc..766cb526b4e1 100644 --- a/pkgs/development/python-modules/snakemake-storage-plugin-fs/default.nix +++ b/pkgs/development/python-modules/snakemake-storage-plugin-fs/default.nix @@ -9,6 +9,7 @@ # dependencies snakemake-interface-common, snakemake-interface-storage-plugins, + reretry, sysrsync, # tests @@ -35,6 +36,7 @@ buildPythonPackage (finalAttrs: { ]; dependencies = [ + reretry snakemake-interface-common snakemake-interface-storage-plugins sysrsync diff --git a/pkgs/development/python-modules/snakemake-storage-plugin-xrootd/default.nix b/pkgs/development/python-modules/snakemake-storage-plugin-xrootd/default.nix index 75e11a4fdc05..37fa04bf8952 100644 --- a/pkgs/development/python-modules/snakemake-storage-plugin-xrootd/default.nix +++ b/pkgs/development/python-modules/snakemake-storage-plugin-xrootd/default.nix @@ -20,9 +20,17 @@ snakemake, }: +# xrootd only exports "/tmp" by default, but pytest's tmp_path is under +# $TMPDIR, so stat and directory-listing requests on test files would be +# rejected with "[3010] ... is disallowed" unless we export more. +let + serverConfig = pkgs.writers.writeText "xrootd-test-server.cfg" '' + all.export / + ''; +in buildPythonPackage (finalAttrs: { pname = "snakemake-storage-plugin-xrootd"; - version = "1.1.0"; + version = "1.2.0"; pyproject = true; __structuredAttrs = true; @@ -30,14 +38,14 @@ buildPythonPackage (finalAttrs: { owner = "snakemake"; repo = "snakemake-storage-plugin-xrootd"; tag = "v${finalAttrs.version}"; - hash = "sha256-vL9JD9h0ywsKpUPoXhgg6b+vwi7kxK8CF3L6HnAEidE="; + hash = "sha256-r4FCGSMJD/PijfExaV1Ps4NaxWMsvlqyBYCt73ENiJQ="; }; postPatch = '' substituteInPlace tests/tests.py \ --replace-fail \ 'subprocess.Popen(["xrootd",' \ - 'subprocess.Popen(["${lib.getExe pkgs.xrootd}",' + 'subprocess.Popen(["${lib.getExe pkgs.xrootd}", "-c", "${serverConfig}",' ''; build-system = [ diff --git a/pkgs/development/python-modules/stopit/default.nix b/pkgs/development/python-modules/stopit/default.nix deleted file mode 100644 index 70ed4c53cc49..000000000000 --- a/pkgs/development/python-modules/stopit/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ - lib, - buildPythonPackage, - fetchFromGitHub, - setuptools, - -}: - -buildPythonPackage (finalAttrs: { - pname = "stopit"; - version = "1.1.2"; - pyproject = true; - __structuredAttrs = true; - - # tests are missing from the PyPi tarball - src = fetchFromGitHub { - owner = "glenfant"; - repo = "stopit"; - tag = finalAttrs.version; - hash = "sha256-uXJUA70JOGWT2NmS6S7fPrTWAJZ0mZ/hICahIUzjfbw="; - }; - - build-system = [ - setuptools # for pkg_resources - ]; - - patches = [ - # https://github.com/glenfant/stopit/pull/34 - ./import_lib.patch - ]; - - pythonImportsCheck = [ "stopit" ]; - - meta = { - broken = lib.versionAtLeast setuptools.version "82"; - description = "Raise asynchronous exceptions in other thread, control the timeout of blocks or callables with a context manager or a decorator"; - homepage = "https://github.com/glenfant/stopit"; - changelog = "https://github.com/glenfant/stopit/blob/${finalAttrs.version}/CHANGES.rst"; - license = lib.licenses.mit; - maintainers = with lib.maintainers; [ veprbl ]; - }; -}) diff --git a/pkgs/development/python-modules/stopit/import_lib.patch b/pkgs/development/python-modules/stopit/import_lib.patch deleted file mode 100644 index 240e4b408e68..000000000000 --- a/pkgs/development/python-modules/stopit/import_lib.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 9204d1de2ae294b878ed726c8278b28696a91f87 Mon Sep 17 00:00:00 2001 -From: Jonathan Kamens -Date: Wed, 25 Sep 2024 15:52:03 -0400 -Subject: [PATCH 1/2] Use importlib instead of pkg_resources to determine - package version - -`pkg_resources` is deprecated and no longer available for import by -default as of Python 3.12. ---- - src/stopit/__init__.py | 22 ++++++++++++++-------- - 1 file changed, 14 insertions(+), 8 deletions(-) - -diff --git a/src/stopit/__init__.py b/src/stopit/__init__.py -index 6ca0180..d2fb01e 100644 ---- a/src/stopit/__init__.py -+++ b/src/stopit/__init__.py -@@ -7,19 +7,25 @@ - Public resources from ``stopit`` - """ - --import pkg_resources -+try: -+ from importlib.metadata import version -+ __version__ = version(__name__) -+except Exception: -+ # pkg_resources is deprecated as of Python 3.12 and no longer available for -+ # import by default. -+ try: -+ import pkg_resources -+ except Exception: -+ LOG.warning( -+ "Could not get the package version from importlib or pkg_resources") -+ __version__ = 'unknown' -+ else: -+ __version__ = pkg_resources.get_distribution(__name__).version - - from .utils import LOG, TimeoutException - from .threadstop import ThreadingTimeout, async_raise, threading_timeoutable - from .signalstop import SignalTimeout, signal_timeoutable - --# PEP 396 style version marker --try: -- __version__ = pkg_resources.get_distribution(__name__).version --except: -- LOG.warning("Could not get the package version from pkg_resources") -- __version__ = 'unknown' -- - __all__ = ( - 'ThreadingTimeout', 'async_raise', 'threading_timeoutable', - 'SignalTimeout', 'signal_timeoutable' - -From a2f6bde8a29cd281577426800b186802c68dbd86 Mon Sep 17 00:00:00 2001 -From: Jonathan Kamens -Date: Mon, 28 Jul 2025 09:13:25 -0400 -Subject: [PATCH 2/2] Import LOG before trying to use it - ---- - src/stopit/__init__.py | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/stopit/__init__.py b/src/stopit/__init__.py -index d2fb01e..bbf7068 100644 ---- a/src/stopit/__init__.py -+++ b/src/stopit/__init__.py -@@ -7,6 +7,8 @@ - Public resources from ``stopit`` - """ - -+from .utils import LOG, TimeoutException -+ - try: - from importlib.metadata import version - __version__ = version(__name__) -@@ -22,7 +24,6 @@ - else: - __version__ = pkg_resources.get_distribution(__name__).version - --from .utils import LOG, TimeoutException - from .threadstop import ThreadingTimeout, async_raise, threading_timeoutable - from .signalstop import SignalTimeout, signal_timeoutable - diff --git a/pkgs/development/python-modules/tt-flash/default.nix b/pkgs/development/python-modules/tt-flash/default.nix index 37a750b8401c..9ef363561095 100644 --- a/pkgs/development/python-modules/tt-flash/default.nix +++ b/pkgs/development/python-modules/tt-flash/default.nix @@ -18,7 +18,7 @@ buildPythonPackage (finalAttrs: { pname = "tt-flash"; - version = "4.0.0"; + version = "4.1.0"; pyproject = true; __structuredAttrs = true; @@ -27,7 +27,7 @@ buildPythonPackage (finalAttrs: { owner = "tenstorrent"; repo = "tt-flash"; tag = "v${finalAttrs.version}"; - hash = "sha256-efl6Ecz7nBtixGZBv6wLU6Bdq+TLXRXIttgUvKXxQz4="; + hash = "sha256-7ImAI+A229NzNECu3dL6WvsPO0cn8Id/p8/QqyvZ/H8="; }; pythonRelaxDeps = [ diff --git a/pkgs/development/python-modules/xrootd/default.nix b/pkgs/development/python-modules/xrootd/default.nix index 685b35a092c9..b05703719bd5 100644 --- a/pkgs/development/python-modules/xrootd/default.nix +++ b/pkgs/development/python-modules/xrootd/default.nix @@ -14,6 +14,16 @@ buildPythonPackage rec { sourceRoot = "${src.name}/python"; + # The VERSION file exported from the upstream git repository contains an + # unexpanded `$Format:%(describe)$` placeholder, and there is no git + # repository available to `git describe`, so upstream's `get_version()` + # would fall back to a `5.9-rc` development version and fail the + # pythonMetadataCheckPhase. Write the actual version instead. + postPatch = '' + rm VERSION + echo -n "${xrootd.version}" > VERSION + ''; + env.CMAKE_ARGS = lib.toString [ (lib.cmakeFeature "XRootD_INCLUDE_DIR" "${lib.getDev xrootd}/include/xrootd;${src}/src") ]; diff --git a/pkgs/servers/home-assistant/custom-components/blitzortung/package.nix b/pkgs/servers/home-assistant/custom-components/blitzortung/package.nix index 3bfaf6033e3d..41b968f9e13c 100644 --- a/pkgs/servers/home-assistant/custom-components/blitzortung/package.nix +++ b/pkgs/servers/home-assistant/custom-components/blitzortung/package.nix @@ -10,13 +10,13 @@ buildHomeAssistantComponent (finalAttrs: { owner = "mrk-its"; domain = "blitzortung"; - version = "1.7.1"; + version = "1.7.2"; src = fetchFromGitHub { owner = "mrk-its"; repo = "homeassistant-blitzortung"; tag = "v${finalAttrs.version}"; - hash = "sha256-CjO1SeArDYMZyHDNxGGhS26leUEgrpRYiXEWKYdeA7o="; + hash = "sha256-tvrHykntBzbMBPmat7Q/NsjraA1/RwAU95C1TJRFupk="; }; dependencies = [ diff --git a/pkgs/tools/networking/openssh/common.nix b/pkgs/tools/networking/openssh/common.nix index d93f51d24cfd..2d59895f0dec 100644 --- a/pkgs/tools/networking/openssh/common.nix +++ b/pkgs/tools/networking/openssh/common.nix @@ -31,6 +31,8 @@ etcDir ? null, withKerberos ? false, withLdns ? true, + withSelinux ? false, + libselinux, krb5, libfido2, libxcrypt, @@ -99,6 +101,7 @@ stdenv.mkDerivation (finalAttrs: { ++ lib.optional withKerberos krb5 ++ lib.optional withLdns ldns ++ lib.optional withPAM pam + ++ lib.optional withSelinux libselinux ++ lib.optionals withAudit [ audit libcap_ng @@ -151,6 +154,7 @@ stdenv.mkDerivation (finalAttrs: { ++ lib.optional stdenv.hostPlatform.isOpenBSD "--with-bsd-auth" ++ lib.optional withLinuxMemlock "--with-linux-memlock-onfault" ++ lib.optional withAudit "--with-audit=linux" + ++ lib.optional withSelinux "--with-selinux" ++ extraConfigureFlags; buildFlags = [ "SSH_KEYSIGN=ssh-keysign" ]; diff --git a/pkgs/top-level/python-aliases.nix b/pkgs/top-level/python-aliases.nix index 2b43f8cf4100..76e57a170a08 100644 --- a/pkgs/top-level/python-aliases.nix +++ b/pkgs/top-level/python-aliases.nix @@ -733,6 +733,7 @@ mapAliases { steamship = throw "'steamship' has been removed because it is broken and unmaintained upstream"; # Added 2026-05-06 steamworkspy = warnAlias "'steamworkspy' has been renamed to 'steamworks' to match the upstream distribution name" steamworks; # Added 2026-09-19 stookalert = throw "'stookalert' has been removed because it is unmaintained upstream"; # Added 2026-08-04 + stopit = throw "'stopit' has been removed because it is unused and broken"; # Added 2026-08-28 strawberry-django = strawberry-graphql-django; # Added 2026-07-14 subunit2sql = throw "subunit2sql has been removed because it has been marked as broken since at least November 2024."; # Added 2025-10-04 subunit = python-subunit; # added 2026-06-21 diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index d93ba7ab504e..5eec94d87099 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -20079,8 +20079,6 @@ self: super: with self; { stop-words = callPackage ../development/python-modules/stop-words { }; - stopit = callPackage ../development/python-modules/stopit { }; - storage3 = callPackage ../development/python-modules/storage3 { }; stp = toPythonModule (pkgs.stp.override { python3 = self.python; });