Я собираю несколько исполняемых файлов, используя make на Linux. Каждый исполняемый файл имеет свою собственную папку, собственный небольшой make-файл, который включает общий makefile.rules. Поэтому для создания проектов я вызываю каждый make-файл индивидуально с родительским make-файлом.
Примерно так:
# Find Makefiles
MKFLS += $(subst Makefile,,$(shell find */ -name Makefile ))
# Standard build rules, pass down to subordinate make files
all debug install: tags
@$(foreach folder,$(MKFLS), $(MAKE) -C $(folder) $@ || exit;)
Я помещаю общий код в статическую библиотеку. У каждого также есть своя собственная папка и makefile. Я делаю зависимости при создании как исполняемых, так и статических библиотек для exe или lib с помощью:
$(CC) $(CFLAGS) -c -MMD -MP -o $@ $<
Затем включаю сгенерированные файлы (только для этого exe или lib):
-include $(OBJECTS:.o=.d)
Теперь я хочу убедиться, что исполняемый файл создается при изменении одного из файлов исходного или внутреннего заголовка библиотеки. Я попытался включить сгенерированные файлы библиотеки .d, но это не сработало.
Сначала каждый исполняемый файл make определяет статическую библиотеку и место ее создания:
# My Libraries
LOCALLIBS += $(UTILSLIB)/libone.a
LIBSRC += $(UTILSDIR)/onelib
LOCALLIBS += $(UTILSLIB)/libtwo.a
LIBSRC += $(UTILSDIR)/twolib
Затем в глобальномMakefile правил, который включен:
# Rules For Library Dependencies
# Include library dependencies if they exist
-include $(shell find $(LIBSRC) -name \*.d )
# Rule to make libraries that are part of this source tree
$(LOCALLIBS):
$(foreach folder,$(LIBSRC), $(MAKE)-C $(folder) $(MAKECMDGOALS) || exit;)
@touch $(LOCALLIBS)
Я не думаю, что зависимости следуют через статическую библиотеку. Так что даже если libone.a будет собран, исполняемый файл - нет. Потребуется второй запуск марки. Я мог попытаться заставить свой исполняемый файл зависеть от объектов из моего libone.a, но теперь мои make-файлы становятся грязными и сложными.
Итак ... Есть ли способ исправить это? Какой правильный способ сделать это?