Вы действительно не должны использовать $(wildcard ...)
внутри правил, а делать что-то вроде
MYSRC:=$(wildcard *.c)
MYOBJ:=$(patsubst %.c, %.o, $(MYSRC))
%.o: %.c
$(CC) -c $< -o $@
my_binary: $(MYOBJ)
$(CC) $^ -o $@
Таким образом, вы знаете, что MYSRC
и MYOBJ
совпадают. Также обратите внимание на использование $<
для обозначения зависимости текущей цели и $@
для обозначения целевого имени файла текущей цели.
EDIT: изменено $<
на $^
в шаге ссылки, чтобы включить все объектные файлы, а не только последний.
РЕДАКТИРОВАТЬ: Если вы не хотите извлекать исходные имена файлов из child.makefile
, вы должны иметь возможность сделать что-то вроде этого:
.PHONY: all
all:
$(MAKE) --file=child.makefile
$(MAKE) my_binary OBJS="$(wildcard *.o)"
my_binary: $(OBJS)
$(CC) $< -o my_binary
Важной частью является то, что значение OBJS
является постоянным при построении my_binary
. Таким образом, вы четко разбиваете сборку на два этапа, и список объектных файлов читается перед выполнением второй сборки.