我正在开发一个混合 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 源是什么,但事实证明很容易告诉 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/
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 构建。