From 016ba92a432222dbbaa249720373d1c4386d4523 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Sun, 16 Feb 2025 04:58:10 +0800 Subject: [PATCH 1/4] buildRustPackage: avoid global assertions Move assertions down to the corresponding attribute value. Avoid adding assertions to the whole argument set. --- pkgs/build-support/rust/build-rust-package/default.nix | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkgs/build-support/rust/build-rust-package/default.nix b/pkgs/build-support/rust/build-rust-package/default.nix index cd7faf84fb5d0..d79f669f49147 100644 --- a/pkgs/build-support/rust/build-rust-package/default.nix +++ b/pkgs/build-support/rust/build-rust-package/default.nix @@ -62,12 +62,6 @@ ... }@args: -assert - cargoVendorDir == null && cargoDeps == null && cargoLock == null - -> - !(args ? cargoSha256 && args.cargoSha256 != null) && !(args ? cargoHash && args.cargoHash != null) - -> throw "cargoHash, cargoVendorDir, cargoDeps, or cargoLock must be set"; - let cargoDeps' = @@ -77,6 +71,8 @@ let cargoDeps else if cargoLock != null then importCargoLock cargoLock + else if (args.cargoHash or null == null) && (args.cargoSha256 or null == null) then + throw "cargoHash, cargoVendorDir, cargoDeps, or cargoLock must be set" else if useFetchCargoVendor then fetchCargoVendor ( { From 7609cbad7cfbee711150ce754c51f6a2ca5fce28 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Sun, 16 Feb 2025 05:15:39 +0800 Subject: [PATCH 2/4] buildRustPackage: restructure with lib.extendMkDerivation Support fixed-point arguments with lib.extendMkDerivation Postpone formatting for more concise diff. --- .../rust/build-rust-package/default.nix | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/pkgs/build-support/rust/build-rust-package/default.nix b/pkgs/build-support/rust/build-rust-package/default.nix index d79f669f49147..e7238634845bb 100644 --- a/pkgs/build-support/rust/build-rust-package/default.nix +++ b/pkgs/build-support/rust/build-rust-package/default.nix @@ -18,6 +18,18 @@ windows, }: +lib.extendMkDerivation { + constructDrv = stdenv.mkDerivation; + + excludeDrvArgNames = [ + "depsExtraArgs" + "cargoUpdateHook" + "cargoDeps" + "cargoLock" + ]; + + extendDrvArgs = + finalAttrs: { name ? "${args.pname}-${args.version}", @@ -119,15 +131,7 @@ let target = stdenv.hostPlatform.rust.rustcTargetSpec; targetIsJSON = lib.hasSuffix ".json" target; in - -stdenv.mkDerivation ( - (removeAttrs args [ - "depsExtraArgs" - "cargoUpdateHook" - "cargoDeps" - "cargoLock" - ]) - // lib.optionalAttrs (stdenv.hostPlatform.isDarwin && buildType == "debug") { + lib.optionalAttrs (stdenv.hostPlatform.isDarwin && buildType == "debug") { RUSTFLAGS = "-C split-debuginfo=packed " + (args.RUSTFLAGS or ""); } // { @@ -194,5 +198,5 @@ stdenv.mkDerivation ( # default to Rust's platforms platforms = lib.intersectLists meta.platforms or lib.platforms.all rustc.targetPlatforms; }; - } -) + }; +} From 721751bd2326dad2902a81c80a21f621e79e5fd0 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Sun, 16 Feb 2025 05:43:30 +0800 Subject: [PATCH 3/4] buildRustPackage: reformat after refactoring --- .../rust/build-rust-package/default.nix | 336 +++++++++--------- 1 file changed, 168 insertions(+), 168 deletions(-) diff --git a/pkgs/build-support/rust/build-rust-package/default.nix b/pkgs/build-support/rust/build-rust-package/default.nix index e7238634845bb..b98fb69b40d9d 100644 --- a/pkgs/build-support/rust/build-rust-package/default.nix +++ b/pkgs/build-support/rust/build-rust-package/default.nix @@ -30,173 +30,173 @@ lib.extendMkDerivation { extendDrvArgs = finalAttrs: -{ - name ? "${args.pname}-${args.version}", - - # Name for the vendored dependencies tarball - cargoDepsName ? name, - - src ? null, - srcs ? null, - preUnpack ? null, - unpackPhase ? null, - postUnpack ? null, - cargoPatches ? [ ], - patches ? [ ], - sourceRoot ? null, - cargoRoot ? null, - logLevel ? "", - buildInputs ? [ ], - nativeBuildInputs ? [ ], - cargoUpdateHook ? "", - cargoDepsHook ? "", - buildType ? "release", - meta ? { }, - useFetchCargoVendor ? false, - cargoDeps ? null, - cargoLock ? null, - cargoVendorDir ? null, - checkType ? buildType, - buildNoDefaultFeatures ? false, - checkNoDefaultFeatures ? buildNoDefaultFeatures, - buildFeatures ? [ ], - checkFeatures ? buildFeatures, - useNextest ? false, - auditable ? !cargo-auditable.meta.broken, - - depsExtraArgs ? { }, - - # Needed to `pushd`/`popd` into a subdir of a tarball if this subdir - # contains a Cargo.toml, but isn't part of a workspace (which is e.g. the - # case for `rustfmt`/etc from the `rust-sources). - # Otherwise, everything from the tarball would've been built/tested. - buildAndTestSubdir ? null, - ... -}@args: - -let - - cargoDeps' = - if cargoVendorDir != null then - null - else if cargoDeps != null then - cargoDeps - else if cargoLock != null then - importCargoLock cargoLock - else if (args.cargoHash or null == null) && (args.cargoSha256 or null == null) then - throw "cargoHash, cargoVendorDir, cargoDeps, or cargoLock must be set" - else if useFetchCargoVendor then - fetchCargoVendor ( - { - inherit - src - srcs - sourceRoot - cargoRoot - preUnpack - unpackPhase - postUnpack - ; - name = cargoDepsName; - patches = cargoPatches; - hash = args.cargoHash; - } - // depsExtraArgs - ) - else - fetchCargoTarball ( - { - inherit - src - srcs - sourceRoot - cargoRoot - preUnpack - unpackPhase - postUnpack - cargoUpdateHook - ; - name = cargoDepsName; - patches = cargoPatches; - } - // lib.optionalAttrs (args ? cargoHash) { - hash = args.cargoHash; - } - // lib.optionalAttrs (args ? cargoSha256) { - sha256 = lib.warn "cargoSha256 is deprecated. Please use cargoHash with SRI hash instead" args.cargoSha256; - } - // depsExtraArgs - ); - - target = stdenv.hostPlatform.rust.rustcTargetSpec; - targetIsJSON = lib.hasSuffix ".json" target; -in - lib.optionalAttrs (stdenv.hostPlatform.isDarwin && buildType == "debug") { - RUSTFLAGS = "-C split-debuginfo=packed " + (args.RUSTFLAGS or ""); - } - // { - cargoDeps = cargoDeps'; - inherit buildAndTestSubdir; - - cargoBuildType = buildType; - - cargoCheckType = checkType; - - cargoBuildNoDefaultFeatures = buildNoDefaultFeatures; - - cargoCheckNoDefaultFeatures = checkNoDefaultFeatures; - - cargoBuildFeatures = buildFeatures; - - cargoCheckFeatures = checkFeatures; - - nativeBuildInputs = - nativeBuildInputs - ++ lib.optionals auditable [ - (buildPackages.cargo-auditable-cargo-wrapper.override { - inherit cargo cargo-auditable; - }) - ] - ++ [ - cargoBuildHook - (if useNextest then cargoNextestHook else cargoCheckHook) - cargoInstallHook - cargoSetupHook - rustc - cargo - ]; - - buildInputs = - buildInputs - ++ lib.optionals stdenv.hostPlatform.isDarwin [ libiconv ] - ++ lib.optionals stdenv.hostPlatform.isMinGW [ windows.pthreads ]; - - patches = cargoPatches ++ patches; - - PKG_CONFIG_ALLOW_CROSS = if stdenv.buildPlatform != stdenv.hostPlatform then 1 else 0; - - postUnpack = - '' - eval "$cargoDepsHook" - - export RUST_LOG=${logLevel} - '' - + (args.postUnpack or ""); - - configurePhase = - args.configurePhase or '' - runHook preConfigure - runHook postConfigure - ''; - - doCheck = args.doCheck or true; - - strictDeps = true; - - meta = meta // { - badPlatforms = meta.badPlatforms or [ ] ++ rustc.badTargetPlatforms; - # default to Rust's platforms - platforms = lib.intersectLists meta.platforms or lib.platforms.all rustc.targetPlatforms; + { + name ? "${args.pname}-${args.version}", + + # Name for the vendored dependencies tarball + cargoDepsName ? name, + + src ? null, + srcs ? null, + preUnpack ? null, + unpackPhase ? null, + postUnpack ? null, + cargoPatches ? [ ], + patches ? [ ], + sourceRoot ? null, + cargoRoot ? null, + logLevel ? "", + buildInputs ? [ ], + nativeBuildInputs ? [ ], + cargoUpdateHook ? "", + cargoDepsHook ? "", + buildType ? "release", + meta ? { }, + useFetchCargoVendor ? false, + cargoDeps ? null, + cargoLock ? null, + cargoVendorDir ? null, + checkType ? buildType, + buildNoDefaultFeatures ? false, + checkNoDefaultFeatures ? buildNoDefaultFeatures, + buildFeatures ? [ ], + checkFeatures ? buildFeatures, + useNextest ? false, + auditable ? !cargo-auditable.meta.broken, + + depsExtraArgs ? { }, + + # Needed to `pushd`/`popd` into a subdir of a tarball if this subdir + # contains a Cargo.toml, but isn't part of a workspace (which is e.g. the + # case for `rustfmt`/etc from the `rust-sources). + # Otherwise, everything from the tarball would've been built/tested. + buildAndTestSubdir ? null, + ... + }@args: + + let + + cargoDeps' = + if cargoVendorDir != null then + null + else if cargoDeps != null then + cargoDeps + else if cargoLock != null then + importCargoLock cargoLock + else if (args.cargoHash or null == null) && (args.cargoSha256 or null == null) then + throw "cargoHash, cargoVendorDir, cargoDeps, or cargoLock must be set" + else if useFetchCargoVendor then + fetchCargoVendor ( + { + inherit + src + srcs + sourceRoot + cargoRoot + preUnpack + unpackPhase + postUnpack + ; + name = cargoDepsName; + patches = cargoPatches; + hash = args.cargoHash; + } + // depsExtraArgs + ) + else + fetchCargoTarball ( + { + inherit + src + srcs + sourceRoot + cargoRoot + preUnpack + unpackPhase + postUnpack + cargoUpdateHook + ; + name = cargoDepsName; + patches = cargoPatches; + } + // lib.optionalAttrs (args ? cargoHash) { + hash = args.cargoHash; + } + // lib.optionalAttrs (args ? cargoSha256) { + sha256 = lib.warn "cargoSha256 is deprecated. Please use cargoHash with SRI hash instead" args.cargoSha256; + } + // depsExtraArgs + ); + + target = stdenv.hostPlatform.rust.rustcTargetSpec; + targetIsJSON = lib.hasSuffix ".json" target; + in + lib.optionalAttrs (stdenv.hostPlatform.isDarwin && buildType == "debug") { + RUSTFLAGS = "-C split-debuginfo=packed " + (args.RUSTFLAGS or ""); + } + // { + cargoDeps = cargoDeps'; + inherit buildAndTestSubdir; + + cargoBuildType = buildType; + + cargoCheckType = checkType; + + cargoBuildNoDefaultFeatures = buildNoDefaultFeatures; + + cargoCheckNoDefaultFeatures = checkNoDefaultFeatures; + + cargoBuildFeatures = buildFeatures; + + cargoCheckFeatures = checkFeatures; + + nativeBuildInputs = + nativeBuildInputs + ++ lib.optionals auditable [ + (buildPackages.cargo-auditable-cargo-wrapper.override { + inherit cargo cargo-auditable; + }) + ] + ++ [ + cargoBuildHook + (if useNextest then cargoNextestHook else cargoCheckHook) + cargoInstallHook + cargoSetupHook + rustc + cargo + ]; + + buildInputs = + buildInputs + ++ lib.optionals stdenv.hostPlatform.isDarwin [ libiconv ] + ++ lib.optionals stdenv.hostPlatform.isMinGW [ windows.pthreads ]; + + patches = cargoPatches ++ patches; + + PKG_CONFIG_ALLOW_CROSS = if stdenv.buildPlatform != stdenv.hostPlatform then 1 else 0; + + postUnpack = + '' + eval "$cargoDepsHook" + + export RUST_LOG=${logLevel} + '' + + (args.postUnpack or ""); + + configurePhase = + args.configurePhase or '' + runHook preConfigure + runHook postConfigure + ''; + + doCheck = args.doCheck or true; + + strictDeps = true; + + meta = meta // { + badPlatforms = meta.badPlatforms or [ ] ++ rustc.badTargetPlatforms; + # default to Rust's platforms + platforms = lib.intersectLists meta.platforms or lib.platforms.all rustc.targetPlatforms; + }; }; - }; } From 31e261a67af18d09bba1ea6b76e997ab25356aac Mon Sep 17 00:00:00 2001 From: TomaSajt <62384384+TomaSajt@users.noreply.github.com> Date: Mon, 13 Jan 2025 17:55:43 +0100 Subject: [PATCH 4/4] uiua: use finalAttrs pattern --- pkgs/by-name/ui/uiua/package.nix | 130 +++++++++++++++---------------- 1 file changed, 64 insertions(+), 66 deletions(-) diff --git a/pkgs/by-name/ui/uiua/package.nix b/pkgs/by-name/ui/uiua/package.nix index f9d5b3513ba3e..c3de58883051d 100644 --- a/pkgs/by-name/ui/uiua/package.nix +++ b/pkgs/by-name/ui/uiua/package.nix @@ -30,77 +30,75 @@ let .${uiua_versionType}; in -# buildRustPackage doesn't support finalAttrs, so we can't use finalPackage for the tests -lib.fix ( - uiua: - rustPlatform.buildRustPackage rec { - pname = "uiua"; - inherit (versionInfo) version cargoHash; - useFetchCargoVendor = true; +rustPlatform.buildRustPackage (finalAttrs: { + pname = "uiua"; + inherit (versionInfo) version cargoHash; + useFetchCargoVendor = true; - src = fetchFromGitHub { - owner = "uiua-lang"; - repo = "uiua"; - inherit (versionInfo) tag hash; - }; + src = fetchFromGitHub { + owner = "uiua-lang"; + repo = "uiua"; + inherit (versionInfo) tag hash; + }; - nativeBuildInputs = - lib.optionals (webcamSupport || stdenv.hostPlatform.isDarwin) [ rustPlatform.bindgenHook ] - ++ lib.optionals audioSupport [ pkg-config ]; + nativeBuildInputs = + lib.optionals (webcamSupport || stdenv.hostPlatform.isDarwin) [ rustPlatform.bindgenHook ] + ++ lib.optionals audioSupport [ pkg-config ]; - buildInputs = - [ libffi ] # we force dynamic linking our own libffi below - ++ lib.optionals (audioSupport && stdenv.hostPlatform.isLinux) [ alsa-lib ]; + buildInputs = + [ libffi ] # we force dynamic linking our own libffi below + ++ lib.optionals (audioSupport && stdenv.hostPlatform.isLinux) [ alsa-lib ]; - buildFeatures = - [ "libffi/system" ] # force libffi to be linked dynamically instead of rebuilding it - ++ lib.optional audioSupport "audio" - ++ lib.optional webcamSupport "webcam" - ++ lib.optional windowSupport "window"; + buildFeatures = + [ "libffi/system" ] # force libffi to be linked dynamically instead of rebuilding it + ++ lib.optional audioSupport "audio" + ++ lib.optional webcamSupport "webcam" + ++ lib.optional windowSupport "window"; - postFixup = - let - runtimeDependencies = lib.optionals windowSupport [ - libGL - libxkbcommon - wayland - xorg.libX11 - xorg.libXcursor - xorg.libXi - xorg.libXrandr - ]; - in - lib.optionalString (runtimeDependencies != [ ] && stdenv.hostPlatform.isLinux) '' - patchelf --add-rpath ${lib.makeLibraryPath runtimeDependencies} $out/bin/uiua - ''; - - nativeInstallCheckInputs = [ versionCheckHook ]; - versionCheckProgramArg = "--version"; - doInstallCheck = true; - - passthru.updateScript = versionInfo.updateScript; - passthru.tests.run = runCommand "uiua-test-run" { nativeBuildInputs = [ uiua ]; } '' - uiua init - diff -U3 --color=auto <(uiua run main.ua) <(echo '"Hello, World!"') - touch $out + postFixup = + let + runtimeDependencies = lib.optionals windowSupport [ + libGL + libxkbcommon + wayland + xorg.libX11 + xorg.libXcursor + xorg.libXi + xorg.libXrandr + ]; + in + lib.optionalString (runtimeDependencies != [ ] && stdenv.hostPlatform.isLinux) '' + patchelf --add-rpath ${lib.makeLibraryPath runtimeDependencies} $out/bin/uiua ''; - meta = { - changelog = "https://github.com/uiua-lang/uiua/blob/${src.rev}/changelog.md"; - description = "Stack-oriented array programming language with a focus on simplicity, beauty, and tacit code"; - longDescription = '' - Uiua combines the stack-oriented and array-oriented paradigms in a single - language. Combining these already terse paradigms results in code with a very - high information density and little syntactic noise. + nativeInstallCheckInputs = [ versionCheckHook ]; + versionCheckProgramArg = "--version"; + doInstallCheck = true; + + passthru.updateScript = versionInfo.updateScript; + passthru.tests.run = + runCommand "uiua-test-run" { nativeBuildInputs = [ finalAttrs.finalPackage ]; } + '' + uiua init + diff -U3 --color=auto <(uiua run main.ua) <(echo '"Hello, World!"') + touch $out ''; - homepage = "https://www.uiua.org/"; - license = lib.licenses.mit; - mainProgram = "uiua"; - maintainers = with lib.maintainers; [ - cafkafk - tomasajt - defelo - ]; - }; - } -) + + meta = { + changelog = "https://github.com/uiua-lang/uiua/blob/${finalAttrs.src.rev}/changelog.md"; + description = "Stack-oriented array programming language with a focus on simplicity, beauty, and tacit code"; + longDescription = '' + Uiua combines the stack-oriented and array-oriented paradigms in a single + language. Combining these already terse paradigms results in code with a very + high information density and little syntactic noise. + ''; + homepage = "https://www.uiua.org/"; + license = lib.licenses.mit; + mainProgram = "uiua"; + maintainers = with lib.maintainers; [ + cafkafk + tomasajt + defelo + ]; + }; +})