如何使用 Rust 进行自动工具 VPATH 构建

问题描述 投票:0回答:2

我正在开发一个混合 C、C++ 和 Rust 代码的库项目。由于历史原因,我使用自动工具来驱动构建。

本质上,我的

Makefile.am
看起来像这样:

libfoo_la_LIBADD += rustfoo/target/release/librustfoo.a

rustfoo/target/release/librustfoo.a:
    cd rustfoo/; \
    cargo rustc --release -- --crate-type staticlib

dist-hook:
    mkdir -p $(distdir)/rustfoo
    cp -a $(srcdir)/rustfoo/* $(distdir)/rustfoo
    rm -rf $(distdir)/rustfoo/target

请注意,在某些

....librustfoo_a_SOURCES
变量或类似变量中枚举所有 Rust 源文件是不切实际的。 (主要是因为,我在
rustfoo/dependencies/
中捆绑了一些依赖项。)

对于非 VPATH 构建,一切正常,但对于 VPATH 构建,则按预期失败。 Autotools 不知道 Rust 来源,无法将它们复制/链接到

$(builddir)
。当然,我可以 cd 进入源代码树

 rustfoo/target/release/librustfoo.a:
    cd $(srcdir)/rustfoo/; ...

但这会违背 VPATH 构建的目的。

有没有最佳实践来解决这个问题?

rust autotools vpath
2个回答
2
投票

我实际上找到了一个依赖于目前对我有用的货物的解决方案。但我仍然对一种更自动的方式来实现这一目标感兴趣。

我不知道如何告诉自动工具 Rust 源是什么,但事实证明很容易告诉 Rust 应该将其编译输出放在哪里(--target-dir)。构建

.../librustfoo.a
时,cd 到 $(srcdir) 并将输出重定向到构建树中相应的目标目录,如下所示:

rustfoo/target/release/librustfoo.a: cd $(srcdir)/rustfoo/; \ cargo rustc --release -- --crate-type staticlib --target-dir $(abs_builddir)/rustfoo/target/
    

0
投票
我现在正在这样做:

https://github.com/SentryPeer/SentryPeer/blob/main/configure.ac#L174

https://github.com/SentryPeer/SentryPeer/blob/main/Makefile.am#L23

https://github.com/SentryPeer/SentryPeer/blob/main/Makefile.am#L254

虽然我通过 lib 将 Rust 添加到我的 C 项目中,但随后我的 Rust lib 将我的 C 项目称为 lib :-)

我实际上被困在这里了:

https://github.com/SentryPeer/SentryPeer/blob/main/sentrypeer_rust/build.rs#L34

尝试从 make 中获取一些环境变量,以便我可以从 Rust 端查找我的 C 源代码以进行“make distcheck”/VPATH 构建。

© www.soinside.com 2019 - 2024. All rights reserved.