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 -
)