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并发

Download history 1125900/week @ 2024-05-02 1081026/week @ 2024-05-09 1111227/week @ 2024-05-16 1069149/week @ 2024-05-23 1209272/week @ 2024-05-30 1197833/week @ 2024-06-06 1192837/week @ 2024-06-13 1191675/week @ 2024-06-20 1229289/week @ 2024-06-27 1133269/week @ 2024-07-04 1210762/week @ 2024-07-11 1287361/week @ 2024-07-18 1399574/week @ 2024-07-25 1384316/week @ 2024-08-01 1426908/week @ 2024-08-08 1361924/week @ 2024-08-15

5,831,497 每月下载量
用于 8,679 个 crates (20 直接)

MIT/Apache

70KB
1K SLoC

jobserver-rs

Rust 的 GNU Make jobserver 实现。

crates.io

文档

用法

将此添加到您的 Cargo.toml

[dependencies]
jobserver = "0.1"

许可协议

此项目根据以下协议之一许可:

由您选择。

贡献

除非您明确声明,否则根据 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兼容。

依赖关系