我对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)
答案 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