Я создал Makefile для модульных тестов, который использует GCC с аргументами для создания профилирующих файлов (gcno) во время компиляции. Вот similified его часть, где компиляции и компоновки имеет место:Зависимости Makefile от нескольких файлов
UTEXE = $(UTOBJSDIR)\$(UTUNIT).exe
UTOBJS = $(UTUUTSRC:.c=.o) $(UTUTSRC:.c=.o) $(UTCSRC:.c=.o)
UTOBJSFULL = $(addprefix $(UTOBJSDIR)\,$(UTOBJS))
UTOBJSGCNO = $(addprefix $(UTOBJSDIR)\,$(UTOBJS:.o=.gcno))
$(UTOBJS): %.o: %.c $(UTMAKEDEP)
$(call report,Compiling $(*F).c)
$(MKDEP) $(MKDFLAGS) -o.o -f$(UTOBJSDIR)\$(*F).dep $(subst /,\,$<)
$(CC) -c $(CFLAGS) $(subst /,\,$<) -o $(UTOBJSDIR)/[email protected]
$(UTOBJSGCNO): $(UTOBJS) $(UTMAKEDEP)
utbuild: $(UTEXE) $(UTOBJSGCNO) $(UTOBJS) $(UTMAKEDEP)
$(UTEXE): $(UTOBJSGCNO) $(UTOBJS) $(UTMAKEDEP)
$(call report,Linking to $(UTUNIT).exe)
$(LINK) $(UTOBJSFULL) $(LNKFLAGS) -o $(UTEXE)
Он собирает все объектные и профильные файлы и ссылки вместе бинарный файл. Однако, когда я удаляю файл профиля (gcno) и снова вызываю «utbuild», он не будет повторно компилироваться для восстановления файла .gcno. Он пытается сделать ссылку снова, потому что gcno является для него префиксным, но он не выполняет компиляцию.
Я не знаю, как назвать этот случай, так что не удалось найти решение из Интернета. В основном один рецепт создает два файла, и я не знаю, как написать правило, которое повторно запускает рецепт, даже когда нужно восстановить только один файл.
Буду признателен за ссылки или подсказки.
'$ (UTOBJSGCNO): $ (UTOBJS) $ (UTMAKEDEP)' сообщает, что * каждый * '.gcno' файл имеет * каждый *' .o' файл в качестве необходимого условия. Это почти наверняка не то, что вы хотите. –
@ EtanReisner Да, он делает здесь избыток, но это не его вопрос, поскольку по его точному вопросу я думаю, что он просто нуждается в '.'. Трудно проверить, хотя бывало, что это немного беспорядок :) –
первые 4 строки (некоторые макроопределения) должны использовать ': =', а не '=', поэтому макрос оценивается только один раз. – user3629249