gpt4 book ai didi

makefile - GNU Make 动态规则的问题

转载 作者:行者123 更新时间:2023-11-29 08:28:08 27 4
gpt4 key购买 nike

我正在尝试设置一个 Makefile 来编译我的 Rust 项目。为了加快速度,我不想一次重新编译整个项目。 Rust 允许您创建可以链接到主可执行文件的库。给定两个文件 src/iomrascalai.rs(主程序)和 src/board/mod.rs(库)来手动编译它,它将像这样工作:

$ rustc --out-dir lib src/board/mod.rs
$ ls lib/
libboard-d085aa56-0.0.rlib
$ rustc --out-dir bin -L lib src/iomrascalai.rs
$ ls bin/
iomrascalai

我在 Makefile 中尝试做的是定义编译库的动态规则。我正在尝试这样做,因为从源文件 (src/board/mod.rs) 到库名称 (lib/libboard-d085aa56-0.0.rlib 的映射>) 是不平凡的。但是,我似乎无法让它工作:

MAIN   = src/iomrascalai.rs
CRATES = src/board/mod.rs

LIBS = $(foreach crate, $(CRATES), $(call TO_LIB, $(crate)))

all: exe

exe: $(MAIN) $(LIBS)
rustc --out-dir bin -L lib $(MAIN)

TO_LIB = $(addprefix lib/, $(shell rustc --crate-file-name $(1)))

define COMPILE_CRATE
$(call TO_LIB, $(1)): $(1)
rustc --out-dir lib $(1)
endef

$(foreach crate, $(CRATES), $(eval $(call COMPILE_CRATE, $(crate))))

运行 make 会导致以下错误:

$ make
rustc --out-dir bin -L lib src/iomrascalai.rs
src/iomrascalai.rs:22:1: 22:20 error: can't find crate for `board`
src/iomrascalai.rs:22 extern crate board;
^~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
make: *** [exe] Error 101

所以库没有被编译,这意味着主程序不能被编译。当我尝试运行 make 来编译 lib 目标时,它起作用了:

$ rustc --crate-file-name src/board/mod.rs
libboard-d085aa56-0.0.rlib
$ make lib/libboard-d085aa56-0.0.rlib
rustc --out-dir lib src/board/mod.rs

所以出于某种原因 exe 不遵守先决条件,即使规则已定义......

最佳答案

递归扩展的 make 变量(用 = 赋值的变量)在变量被替换时被扩展。这意味着,您使用的其他变量需要先定义。在你的情况下,你需要将 TO_LIB 的定义向上移动几行(至少在 exe 规则之上,因为 LIBS 的扩展需要有 TO_LIB 在那里可用)

关于makefile - GNU Make 动态规则的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23385582/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com