如何在Makefile中的子目录中递归查找源文件?

时间:2017-04-16 15:28:26

标签: recursion makefile

我对很新,但我仍然无法理解如何设置源文件的子目录。

我的目录树是:

i18n/
src/
    engine/
    graphics/ (currently only directory used)

我正在使用this premade Makefile

TARGET = caventure
LIBS = -lSDL2
CC = g++
CFLAGS = -Wall
TGTDIR = build

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.cpp, %.o, $(wildcard *.cpp))
HEADERS = $(wildcard *.h)

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

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $(TGTDIR)/$(TARGET)

clean:
    -rm -f *.o
    -rm -f $(TARGET)

2 个答案:

答案 0 :(得分:2)

GNU make&#39; wildcard函数不会递归访问所有子目录。 您需要一个递归变体,可以按照以下答案中的描述实现:

https://stackoverflow.com/a/18258352/1221106

因此,您需要使用该递归通配符函数而不是$(wildcard *.cpp)

答案 1 :(得分:1)

另一种简单的递归查找文件的方法可能是只使用find

例如,如果您具有这样的布局。

$ tree .
.
├── d1
│   └── foo.txt
├── d2
│   ├── d4
│   │   └── foo.txt
│   └── foo.txt
├── d3
│   └── foo.txt
└── Makefile

您可以编写这样的Makefile。

index.txt: $(shell find . -name "*.txt")                                             
    echo $^                                                                           

哪个打印出来。

$ make
echo d2/d4/foo.txt d2/foo.txt d1/foo.txt d3/foo.txt
d2/d4/foo.txt d2/foo.txt d1/foo.txt d3/foo.txt