使用旧的 Rust 2015
0.1.1 |
|
---|---|
0.1.0 |
|
0.0.2 |
|
0.0.1 |
|
#16 在 #pkg-config
用于 libnanomsg
13KB
259 行
link-config
一种 Rust 语法扩展,在构建时运行 pkg-config
以确定如何链接本地依赖项。
#![feature(phase)]
#[phase(plugin)]
extern crate link_config = "link-config";
link_config!("libcurl")
extern {
fn curl_easy_init() -> *mut ();
}
fn main() {
let handle = unsafe { curl_easy_init() };
// ...
}
动态链接与静态链接
调用 link_config!
宏将生成两个 extern 块,如下所示
// foo.rs
link_config!("mylib")
// foo-expanded.rs
#[cfg(statik = "mylib")]
#[link(..., kind = "static")]
extern {}
#[cfg(not(statik = "mylib"))]
#[link(...)]
extern {}
这意味着默认是动态依赖项,但可以通过以下方式指定静态依赖项
$ rustc foo.rs --cfg 'statik="mylib"'
配置输出
当前调用完全语法是
link_config!("foo", ["bar", "baz"])
正在链接的库称为 foo
,而 bar
/baz
是 link_config!
宏本身的选项。目前已知选项有
only_static
- 仅输出静态链接的块,并默认启用。only_dylib
- 仅输出动态链接的块,并默认启用。favor_static
- 不输出not(statik = "mylib")
,而是输出not(dylib = "mylib")
,默认优先选择静态块。system_static
- 允许系统依赖项以静态方式链接。默认情况下不允许这样做。
它是如何工作的?
在链接本地库时,这个语法扩展主要关注回答三个问题
- 本地库的本地名称是什么?
- 本地库的依赖项是什么?
- 所有内容在哪里?
这个库不关心链接器和其他各种配置选项的特定平台标志,这些标志并不总是必要的。
为了回答这些问题,这个库目前使用 pkg-config
的 --libs
选项在 构建时 外壳调用,并过滤返回值以回答上述问题。对于静态链接,工具使用 --static
语法扩展随后生成一个带有适当的 #[link]
和 #[cfg]
属性的 extern
块。
待办事项列表
- 自定义 Rust 脚本来实现针对特定平台的库和依赖项的逻辑。这也有助于那些不一定使用
pkg-config
的工具,例如 LLVM 或 postgres。 - 如果
pkg-config
不可用,则作为后备选项集成pkgconf
。
许可证
link-config
主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发,部分内容受各种类似 BSD 的许可证保护。
请参阅 LICENSE-APACHE 和 LICENSE-MIT 以获取详细信息。