我有这个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将变得丑陋。我在这里不能正确使用通配符功能吗?
答案 0 :(得分:1)
您需要将CSRC
定义为:
CSRC:= $(foreach dir,$(SRCDIR),$(wildcard $(dir)/*))
如果您查看documentation:
$(wildcard pattern…)
该字符串在makefile中的任何位置使用,由与给定文件名模式之一匹配的现有文件名称的空格分隔列表代替。
这意味着您的原始行实际显示为:
CSRC := $(wildcard src1/ src2/*.c)
即名称与src1/
或src2/*.c
匹配的文件。