在一个简单的嵌入式项目中,我有两个文件main.rs
和module.rs
。为了构建项目,我使用类似的东西:
all: main.o
$(CC) main.o $(LDFLAGS)
%.o: %.rs
$(RUSTC) $(RUSTFLAGS) -o ${@} ${<}
如果仅更改module.rs
,make all
将不会重新编译我的Rust代码。我该如何解决这个问题?
我发布了一个次优的自我回答作为第一步,但我希望看到更好的方法。
答案 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:
部分是硬编码的。如果要编译多个顶级模块,则会出现代码重复