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)
Другие вопросы по тегам