Я думаю, что раздел руководства, о котором я упоминал (примечание № 5), объясняет это очень хорошо. Я не думаю, что я мог бы сделать лучше.
аюсь создать цели, которые зависят от списка файлов в каталоге с именем цели:
bin/%.out: src/%/ $(shell find src/%/* -type f -iname '*.cpp' -o -iname '*.hpp')
# Build stuff here
тем не мениеshell find src/%/* ...
в конечном итоге расширяется доshell find src//* ...
, Сначала я думал, что это потому, что у меня может быть только один целевой шаблон, но даже после удаленияsrc/%/
зависимость это закончилось этой же проблемой.
Еще немного контекста: мой каталог содержит каталог 'src', который содержит каталоги. Каждый подкаталог 'src' я рассматриваю как "проект". Когда я собираю, все объектные файлы должны войти вout/src/projname
, Я пытаюсь использоватьfind
чтобы рекурсивно получить все исходные и заголовочные файлы для проекта. Все двоичные файлы будут идти вbin/projname.out
и как таковые, основные зависимости.out
файлы вbin
которые имеют те же имена, что и их имя проекта. (еслиsrc/abc
существует,bin/abc.out
это зависимостьall
).
Таким образом, для каждого подкаталога вsrc
все исходные файлы скомпилированы и объектные файлы перемещены вout/projname
который в конечном итоге будет связан сbin/projname.out
.
В данный момент получаем список проектов и список выходных файлов следующим образом:
SRCS := $(shell find src/* -maxdepth 0 -type d)
SRCS_OUT := $(patsubst src/%,bin/%.out,$(SRCS))
...
all: out/ bin/ $(SRCS_OUT)
Проекты могут содержать подкаталоги и тому подобное, поэтому я используюfind
в коде в самом верху.