Skip to content

Parallel builds broken #11

@qknight

Description

@qknight

problem

  • nix build has such a minor cpu utilization, i only see a load of 25% at max
  • cargo build basically goes to 100%

it seems in this video it was doing much more parallel builds: https://asciinema.org/a/742433

observation (parallelism)

nix build --file target/debug/nix/cargo_build_caller.nix deps.adler2-2_0_0-115180b36279fc7c deps.anstyle-1_0_10-bf6d032cb7d79be1 deps.allocator-api2-0_2_21-bd3713078dfee01f -L

shows that these 3 are build in parallel!

experiment

created passthru-test to experiment and it shows parallel builds work there!

findings

in the generated nix build system i use passthru in this line:

${fn.rustc_propagated_arguments passthru.rust_crate_libraries}

and if i remove it, it builds in parallel!

so what is the cause? this is the implementation:

1. rustc_propagated_arguments = rust_crate_libraries: lib.replaceStrings ["\n"] [""] (builtins.concatStringsSep " " (map (crate:
2.   if builtins.pathExists "${crate}/nix/rustc-propagated-arguments" then
3.    builtins.readFile "${crate}/nix/rustc-propagated-arguments"
4.  else
5.    ""
6.  ) (allCollectedInputs rust_crate_libraries)));

caused by line 2+3, so it blocks because of the pathExists/readFile since that requires the file be there during nix evaluation time and not during build time. (not sure if the terms were used correctly).

solution ideas

idea1

  • replace builtins.pathExists/builtins.readFile and built the rustc command from bash. i tried this for a while but ran in into the problem with empty spaces ' ':
        proc-macro2> Compiling proc-macro2-1_0_97-script_build-b0e673af67401d13
        proc-macro2> @cargo { "type":0, "crate_name":"proc-macro2", "crate_type":"(build.rs build)", "id":"proc-macro2-1_0_97-script_build-b0e673af67401d13" }
        proc-macro2> +++ /nix/store/h1c2imj0dpfyyfrd0i6195xznqxcar8x-rust-stable-2025-08-07/bin/rustc --crate-name build_script_build --edition=2021 build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no --cfg 'feature="default"' --cfg 'feature="proc-macro"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("default", "nightly", "proc-macro", "span-locations"))' -C metadata=800301207300bbac -C extra-filename=-b0e673af67401d13 --out-dir /nix/store/rdjqd65zqgxkydyb4nl217423539nqn2-proc-macro2-1_0_97-script_build-b0e673af67401d13 -L dependency=/nix/store/46wmzlzs30vcq83wbm1q516cpd0p0zqx-rustc-linker-arguments-dir/deps collect_rustc_propagated_arguments ' ' --cap-lints allow
        proc-macro2> +++ rustc_exit_value=1
        proc-macro2> +++ set +x -e
        proc-macro2> error: multiple input filenames provided (first two filenames are `build.rs` and `collect_rustc_propagated_arguments`)
        proc-macro2> 

doing this with bash is hard, i had this before and it forced me to do the code in the way it is now.

idea 2

maybe using nushell instead of bash could be a thing.

let binary = 'my_binary'
let args = ['arg1', 'arg2', '--flag']

# Example: variable with 20 paths
let paths = [
    "/path/a", "/path/b", "/path/c", "/path/d", "/path/e",
    "/path/f", "/path/g", "/path/h", "/path/i", "/path/j",
    "/path/k", "/path/l", "/path/m", "/path/n", "/path/o",
    "/path/p", "/path/q", "/path/r", "/path/s", "/path/t"
]

# Read "mycommand" file from each path, concatenate their contents with a space
let extra_arg = ($paths | each { |p| open $"($p)/mycommand" | str trim } | str join ' ')

# Extend args with the concatenated extra argument
let args = $args ++ [$extra_arg]

let command = [$binary] ++ $args

do $command

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions