Makefile通配符和变量扩展

4

我有这个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将会变得很丑陋。我在这里没有正确使用通配符函数吗?

1个回答

6
你需要的 CSRC 定义应该是:
CSRC:= $(foreach dir,$(SRCDIR),$(wildcard $(dir)/*))

如果你查看文档

$(wildcard pattern…)

在makefile的任何位置使用此字符串,将被替换为匹配给定文件名模式之一的现有文件名的以空格分隔的列表...

这意味着你原来的那行代码实际上是这样的:

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

这是与 src1/src2/*.c 匹配的文件名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接