#link #native #pkg-config #linker #directive #execution #detect

已删除 link-config

在编译时执行 pkg-config 以检测应该插入哪些 #[link] 指令以链接到本地库

使用旧的 Rust 2015

0.1.1 2014年12月16日
0.1.0 2014年12月8日
0.0.2 2014年11月23日
0.0.1 2014年11月23日

#16#pkg-config


用于 libnanomsg

MIT/Apache

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/bazlink_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 以获取详细信息。

无运行时依赖