gpt4 book ai didi

Makefile 通配符和变量扩展

转载 作者:行者123 更新时间:2023-12-04 01:48:22 24 4
gpt4 key购买 nike

我有这个 Makefile(缩写):

COMPILE                  = armcc
LINK = armlink
SRCDIR := ./src1 \
./src2

INCLUDES := -I ./inc
CSRC := $(wildcard $(SRCDIR)/*.c)
# CSRC := ./src1/*.c ./src2/*.c
OBJS := $(CSRC:.c=.o)

.PHONY: clean

clean:
@echo "Clean Finished"

%.o: %.c
@echo Compiling $<
@$(COMPILE) $(INCLUDES) $< -o $@

mktest: $(OBJS) Makefile
@echo $(CSRC)
@echo $(OBJS)
@echo building mktest
@$(LINK) -o mktest.axf

当我运行它时,通配符只扩展到 SRCDIR 变量中的最后一个条目,即 ./src2。输出如下所示。

c:> make mktest
./src1 ./src2/file2.c
./src1 ./src2/file2.o
building mktest

如果我将 CSRC 定义的行替换为它下面的行。它工作正常,输出如下所示。

c:> make mktest
./src1/*.c ./src2/*.c
./src1/*.o ./src2/*.o
building mktest

如果我只想包含几个子目录,这没问题。但是如果我想包含更多,Makefile 就会变得丑陋。我在这里没有正确使用通配符功能吗?

最佳答案

您需要的 CSRC 定义是:

CSRC:= $(foreach dir,$(SRCDIR),$(wildcard $(dir)/*))

如果您查看 documentation :

$(wildcard pattern…)

This string, used anywhere in a makefile, is replaced by a space-separated list of names of existing files that match one of the given file name patterns…

这意味着您的原始行实际上读作:

CSRC := $(wildcard src1/ src2/*.c)

即名称与 src1/src2/*.c 匹配的文件。

关于Makefile 通配符和变量扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54374554/

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