Опция / правило Makefile для обработки отсутствующих / удаленных исходных файлов - PullRequest
1 голос
/ 17 мая 2010

Требуется правило зависимостей make-файла, которое может обрабатывать отсутствующие файлы дает некоторые советы о том, как обрабатывать удаленные исходные файлы для генерации файлов .o. Я использую gcc / g ++, поэтому добавление опции -MP при генерации зависимостей прекрасно работает для меня, пока я не доберусь до стадии соединения с моим файлом .a ...

А как насчет обновления архивов / библиотек, когда источники ввода исчезают? Это работает нормально для меня, но есть ли более чистый способ (т. Е. Что-то такое же простое, как опция g ++ -MP)?

#BUILD_DIR is my target directory (includes Debug/Release and target arch)
#SRC_OUTS are my .o files    

LIBATLS_HAS = $(shell nm ${BUILD_DIR}/libatls.a | grep ${BUILD_DIR} | sed -e 's/.*(//' -e 's/).*://')
LIBATLS_REMOVE = $(filter-out $(notdir ${SRC_OUTS}), ${LIBATLS_HAS})

${BUILD_DIR}/libatls.a: ${BUILD_DIR}/libatls.a(${SRC_OUTS})
ifneq ($(strip ${LIBATLS_REMOVE}),)
    $(AR) -d $@ ${LIBATLS_REMOVE}
endif

Обновлено до следующего после первоначального отзыва:

LIBATLS_HAS := $(shell $(AR) t ${BUILD_DIR}/libatls.a)
LIBATLS_REMOVE := $(filter-out $(notdir ${SRC_OUTS}), $(filter %.o,${LIBATLS_HAS}))

.PHONY: clean_archive
clean_archive:
    $(AR) -d $(BUILD_DIR)/libatls.a $(LIBATLS_REMOVE)

.PHONY: $(LIBATLS_REMOVE)
$(LIBATLS_REMOVE): clean_archive

${BUILD_DIR}/libatls.a: % : %(${SRC_OUTS}) ${LIBATLS_REMOVE}

1 Ответ

0 голосов
/ 17 мая 2010

Есть несколько способов сделать это. Тот, который довольно чист:

LIBATLS_HAS:=$(shell $(AR) t $(BUILD_DIR)/libatls.a)
LIBATLS_REMOVE:= $(filter-out $(SRC_OUTS),$(LIBATLS_HAS))
REMOVE_LIST = $(addprefix remove_,$(LIBATLS_REMOVE))

.PHONY: $(REMOVE_LIST)
$(REMOVE_LIST): remove_%
    $(AR) -d $(BUILD_DIR)/libatls.a $*

$(BUILD_DIR)/libatls.a: % : %($(SRC_OUTS)) $(REMOVE_LIST)

Это немного неэффективно, поскольку для каждого удаляемого члена запускается отдельная команда $(AR). Я сомневаюсь, что это будет проблемой, но если это так, вы можете обойти это с фальшивой целью:

# Note that this will run once at most.
.PHONY: clean_archive
clean_archive:
    $(AR) -d $(BUILD_DIR)/libatls.a $(LIBATLS_REMOVE)

.PHONY: $(REMOVE_LIST)
$(REMOVE_LIST): clean_archive
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...