gpt4 book ai didi

makefile - 如何将先决条件列表与 Make 中的目标列表相关联?

转载 作者:行者123 更新时间:2023-12-05 04:12:55 25 4
gpt4 key购买 nike

假设我有:

TARGETS = a.o b.o c.o
SOURCES = F1/a.c F2/F3/b.c c.c

我要获取:

a.o: F1/a.c
gcc $< -c
b.o: F2/F3/b.c
gcc $< -c
c.o: c.c
gcc $< -c

我想要一个紧凑的表达式来完成这项工作,比如:

$(TARGETS): $(SOURCES)
#Appropriate compile command

最佳答案

您可以使用 VPATH 告诉 make 关于源目录,然后使用一个简单的模式规则:

TARGETS := a.o b.o c.o
VPATH := F1:F2/F3 # Use ; instead of : on Windows

%.o: %.c
$(CC) -c $< -o $@

(或者甚至完全省略规则,在这种情况下使隐式规则可以正常工作)

但是,如果您有在不同路径中以相同方式命名的文件,那将无法正常工作(它只会选择它找到的第一个文件)。这可以像您要​​求的那样压缩列表:

TARGETS := a.o b.o c.o
SOURCES := F1/a.c F2/F3/b.c c.c

$(TARGETS):
$(CC) -c $< -o $@

list-rem = $(wordlist 2,$(words $1),$1)
pairmap = $(and $(strip $2),$(strip $3),$(call \
$1,$(firstword $2),$(firstword $3))$(call \
pairmap,$1,$(call list-rem,$2),$(call list-rem,$3)))
gen-prereq = $(eval $1: $2)

$(call pairmap,gen-prereq,$(TARGETS),$(SOURCES))

我定义了一个明确的规则来编译它的先决条件,但我没有给它任何先决条件。然后我定义了一个 pairmap,它接受一个函数名和两个列表,并为每对元素调用该函数。它是递归的,并由 list-rem 提供帮助,它从列表中取出第一个元素。 gen-prereq 将其第二个参数设置为其第一个参数指定的目标的先决条件。剩下的就是通过 gen-prereq 调用 pairmap,将目标作为第一个列表传递,将源作为第二个列表传递。

另一种可行且更简单的方法是:

TARGETS := a.o b.o c.o
SOURCES := F1/a.c F2/F3/b.c c.c

$(TARGETS):
gcc -c $< -o $@

$(foreach x,$(join $(addsuffix :,$(TARGETS)),$(SOURCES)),$(eval $x))

它的工作原理是将目标和源与它们之间的 : 连接在一起(先决条件)并评估每一个。

关于makefile - 如何将先决条件列表与 Make 中的目标列表相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39179599/

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