Jobserver

在内部,rustc 可以利用并行性。如果 MAKEFLAGS 环境变量中传递了 GNU Make jobserver,则 rustc 将与调用它的构建系统协调。其他标志也可能产生影响,例如 CARGO_MAKEFLAGS。如果没有传递 jobserver,则 rustc 将选择要使用的作业数。

从 Rust 1.76.0 开始,如果 jobserver 似乎可用但无法访问,rustc 将发出警告,例如:

$ echo 'fn main() {}' | MAKEFLAGS=--jobserver-auth=3,4 rustc -
warning: failed to connect to jobserver from environment variable `MAKEFLAGS="--jobserver-auth=3,4"`: cannot open file descriptor 3 from the jobserver environment variable value: Bad file descriptor (os error 9)
  |
  = note: the build environment is likely misconfigured

与构建系统集成

以下小节包含有关如何将 rustc 与构建系统集成,以便正确处理 jobserver 的建议。

GNU Make

从 GNU Make 调用 rustc 时,建议在 Makefile 中将所有 rustc 调用标记为递归(通过在命令行前加上 + 指示符),以便 GNU Make 为它们启用 jobserver。例如:

x:
	+@echo 'fn main() {}' | rustc -

特别是,GNU Make 4.3(截至 2024 年的广泛使用版本)即使在子进程不可用时也会在 MAKEFLAGS 中传递简单的管道 jobserver,这反过来意味着 rustc 会对此发出警告。例如,如果从上面的示例中删除 + 指示符,并且使用例如 make -j2 调用 GNU Make,则会触发上述警告。

对于递归 Make 内 $(shell ...) 内部对 rustc 的调用,可以通过清除 MAKEFLAGS 变量手动禁用 jobserver,例如:

S := $(shell MAKEFLAGS= rustc --print sysroot)

x:
	@$(MAKE) y

y:
	@echo $(S)

CMake

CMake 3.28 在其 add_custom_target 命令中支持 JOB_SERVER_AWARE 选项,例如:

cmake_minimum_required(VERSION 3.28)
project(x)
add_custom_target(x
    JOB_SERVER_AWARE TRUE
    COMMAND echo 'fn main() {}' | rustc -
)

对于早期版本,当将 CMake 与 Makefile 生成器一起使用时,一种解决方法是在命令中某处使用 $(MAKE),以便 GNU Make 将其视为递归 Make 调用,例如:

cmake_minimum_required(VERSION 3.22)
project(x)
add_custom_target(x
    COMMAND DUMMY_VARIABLE=$(MAKE) echo 'fn main() {}' | rustc -
)