makefile перестраивает статическую библиотеку, даже если ничего не изменилось
Я делаю систему сборки на основе рекурсивной (токсичной, но не материальной) марки. Основная проблема, с которой я столкнулся, заключается в том, что make воссоздает библиотеки, которые я проинструктировал, даже если не было никаких изменений в файлах * o.
Вот раздел моего make-файла, который обрабатывает создание статической библиотеки.
all: $(DEPS) $(OBJS) $(LIB_TARGET)
### Archive into a library file (.a)
%.a: $(OBJS)
@echo $(MSG_L)
@echo 'Adding $< to library $@'
$(AR) $(ARFLAGS) $(LIB_DIR)/$@ $^
@echo $(MSG_L)
Под определенными каталогами в их соответствующих make-файлах $(LIB_TARGET) определяется с именем библиотеки, и каждый subdir использует префиксы make-файла, чтобы знать, как создать свой общий ресурс. Теперь моя самая большая проблема заключается в том, что при первом запуске нормально создавать все, кроме второго, или при каждом последующем запуске без каких-либо изменений чего-либо в коде библиотеки воссоздаются (но не файлы * d или * o, они не являются воссозданы, они не удаляются, их временная метка не изменяется, что является нормальным).
make -C modules all
make[3]: Entering directory `F:/automata/tmp/remake/src/modules'
make -C interface all
make[4]: Entering directory `F:/automata/tmp/remake/src/modules/interface'
make -C cli all
make[5]: Entering directory `F:/automata/tmp/remake/src/modules/interface/cli'
------- make Lib -------
Adding cli.o to library libInterface.a
avr-ar rcs F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libInterface.a c
li.o
------- make Lib -------
ПРИМЕЧАНИЕ: это из второго / третьего прогона, здесь видно, что * d и * o не воссозданы
Я создал правило для использования файлов, единственная проблема, которую я вижу, это то, что я помещаю библиотеки в специальный каталог, а не в тот, из которого он получает источники. Любая идея о том, как решить эту проблему, и чтобы система не воссоздала библиотеки?
Спасибо.
1 ответ
Каждый раз, когда вы видите рецепт, который создает целевой файл, который не совсем $@
Вы знаете, что это неправильно, и у вас будет эта проблема.
Здесь вы говорите make, что собираетесь создать цель, соответствующую шаблону %.a
, сопоставить этот шаблон с libInterface.a
и устанавливает $@
в libInterface.a
и вызывает ваш рецепт.
Но ваш рецепт не строит $@
строит $(LIBDIR)/$@
это совершенно другой файл. Так что в следующий раз вы запустите make
будет искать libInterface.a
в качестве предпосылки к all
посмотрите, что он не существует, и перезапустите предоставленное вами правило... которое опять-таки не создаст цель, о которой вы сказали, что это произойдет, $@
, но вместо этого создайте другой файл, который make ничего не знает о.
Вам необходимо использовать:
LIB_TARGET = $(LIB_DIR)/libInterface.a
....
### Archive into a library file (.a)
$(LIB_DIR)/%.a: $(OBJS)
@echo $(MSG_L)
@echo 'Adding $< to library $@'
$(AR) $(ARFLAGS) $@ $^
@echo $(MSG_L)