31 个版本
0.1.32 | 2024年7月23日 |
---|---|
0.1.28 | 2024年2月8日 |
0.1.27 | 2023年10月10日 |
0.1.26 | 2023年2月28日 |
0.1.6 | 2017年7月12日 |
#14 在 并发
5,831,497 每月下载量
用于 8,679 个 crates (20 直接)
70KB
1K SLoC
jobserver-rs
Rust 的 GNU Make jobserver 实现。
用法
将此添加到您的 Cargo.toml
[dependencies]
jobserver = "0.1"
许可协议
此项目根据以下协议之一许可:
- Apache License 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/license/mit)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在 jobserver-rs 中的任何贡献,均应如上双许可,无需任何附加条款或条件。
lib.rs
:
GNU make jobserver 的实现。
该 crate 是用 Rust 实现的 GNU make
jobserver,用于与 make 交互或需要跨进程边界限制某种形式的并行性的 CLI 工具。这最初是为了在 Cargo 中使用而编写的,以便 (a) 当从 make
调用 cargo
时工作(使用 make
的 jobserver)以及 (b) 当 cargo
调用构建脚本时工作,为 make
进程导出 jobserver 实现。
jobserver 实现可以在 在线详细了解,但基本上是跨进程信号量的实现。在 Unix 上,这是通过 pipe
系统调用和管道的读写端实现的,而在 Windows 上,则直接使用 IPC 信号量。从 GNU make
版本 4.4 开始,命名管道成为 Unix 上通信的默认方式。该 crate 也支持这一特性,即继承和转发正确的环境。
make
中的作业服务器协议还规定了何时获取令牌以运行子工作,使用此库的客户应小心实现这些细节,以确保与make
本身的正确交互。
示例
连接到由make
或不同进程设置的作业服务器
use jobserver::Client;
// See API documentation for why this is `unsafe`
let client = match unsafe { Client::from_env() } {
Some(client) => client,
None => panic!("client not configured"),
};
从作业服务器获取和释放令牌
use jobserver::Client;
let client = unsafe { Client::from_env().unwrap() };
let token = client.acquire().unwrap(); // blocks until it is available
drop(token); // releases the token when the work is done
创建一个新的作业服务器并配置子进程以获取访问权限
use std::process::Command;
use jobserver::Client;
let client = Client::new(4).expect("failed to create jobserver");
let mut cmd = Command::new("make");
client.configure(&mut cmd);
注意事项
此库不尝试在进程异常退出时将令牌释放回作业服务器。如果一个获取令牌的进程被用ctrl-c或类似信号杀死,则令牌将不会被释放,作业服务器可能处于损坏状态。
请注意,这通常是正常的,因为ctrl-c意味着整个构建过程正在被拆除,但至少应该知道这一点!
Windows注意事项
在Windows上似乎有两种make
的实现。在MSYS2中,通常一个以mingw32-make
的形式提供,另一个是make
本身。我对这里发生的事情不太熟悉,但就作业服务器相关信息而言,mingw32-make
实现使用Windows信号量,而make
程序则不使用。似乎make
程序使用文件描述符,但我并不真正清楚它是如何工作的,因此此库与Windows上的make
不兼容。然而,它与mingw32-make
兼容。