`make`没有注意到Rust模块中的修改 - 如何更好地将Rust集成到构建中?

时间:2015-09-16 23:26:02

标签: makefile rust

在一个简单的嵌入式项目中,我有两个文件main.rsmodule.rs。为了构建项目,我使用类似的东西:

all: main.o
    $(CC) main.o $(LDFLAGS)

%.o: %.rs
    $(RUSTC) $(RUSTFLAGS) -o ${@} ${<}

如果仅更改module.rsmake all将不会重新编译我的Rust代码。我该如何解决这个问题?

我发布了一个次优的自我回答作为第一步,但我希望看到更好的方法。

3 个答案:

答案 0 :(得分:4)

使用Make的最佳方法是将每个依赖项编码到Makefile中。这就是让人有权知道要重建什么以达到目标状态。

要为C项目执行此操作,您通常会使用类似GCC命令行选项filter: brightness(1.01); 的内容。这使得编译器成为混合,因为它是解析C源代码和理解之间的依赖关系的最佳工具 文件。

Rustc实际上有一个等效的开关,Rust编译器:-M。当您在源文件上运行它时,它将输出扩展名为--emit=dep-info的文件,该文件包含几乎与Makefile兼容的依赖项列表。如果你有一个引用模块.d的{​​{1}},它会输出如下内容:

main.rs

通过一些sed调整,你可以很好地发挥它。然后,您可以在Makefile中包含它:

foo.rs

在这里,我在几个部分中指定了main.d: main.rs foo.rs ,但我相信您可以轻松地将它们修改为模式规则。

答案 1 :(得分:3)

实用的解决方案是使用Cargo,Rust构建工具和包管理器。让它处理依赖关系(本地模块其他包)。

def processURL(url):
    pass
    # Your code here
map(processURL, linkslist)

在此,我已将规则标记为from multiprocessing import Pool list(Pool(processes = 10).map(processURL, linkslist)) ,其中表示&#34;始终运行此规则&#34;。我已添加libbar.dylib: target/debug/libbar.dylib cp $< $@ .PHONY: target/debug/libbar.dylib target/debug/libbar.dylib: cargo build --verbose 以便让Cargo打印出它正在执行的操作,以便您可以验证重建的时间。

如果可以,我建议您删除PHONY步骤,而只是使用嵌套路径,但如果其他内容依赖于当前位置,则可能需要副本。

答案 2 :(得分:1)

模式

%.o: %.rs

熟悉构建C项目,但这不是编写目标的唯一方法。具体到上面的设置,这将解决这种情况:

main.o: main.rs module.rs
    $(RUSTC) $(RUSTFLAGS) -o main.o main.rs

与原始代码的一个值得注意的区别是,输入的名称实际上并不重要。我们可以概括如下:

main.o: $(wildcard *.rs)
    $(RUSTC) $(RUSTFLAGS) -o ${@} ${@:.o=.rs}

这是一个开始,但它仍然有一些我无法摆脱的缺点:

  • main.o:部分是硬编码的。如果要编译多个顶级模块,则会出现代码重复
  • 由于通配符,所有顶级模块都将考虑所有Rust文件。换句话说,更改任何Rust文件将需要完全重新编译。