Makefile 通配符和变量扩展

irs*_*are 4 makefile

我有这个 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
Run Code Online (Sandbox Code Playgroud)

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

c:> make mktest
./src1 ./src2/file2.c
./src1 ./src2/file2.o
building mktest
Run Code Online (Sandbox Code Playgroud)

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

c:> make mktest
./src1/*.c ./src2/*.c
./src1/*.o ./src2/*.o
building mktest
Run Code Online (Sandbox Code Playgroud)

如果我只想包含几个子目录,这是可以的。但如果我想包含更多内容,Makefile 就会变得很难看。我在这里没有正确使用通配符功能吗?

Ond*_* K. 6

您需要的CSRC定义是:

\n
CSRC:= $(foreach dir,$(SRCDIR),$(wildcard $(dir)/*))\n
Run Code Online (Sandbox Code Playgroud)\n

如果您查看文档

\n
\n

$(wildcard pattern\xe2\x80\xa6)

\n

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

\n
\n

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

\n
CSRC := $(wildcard src1/ src2/*.c)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n