Need a makefile dependency rule that can handle missing files提供了一些关于如何处理已删除的源文件以生成.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}
答案 0 :(得分:0)
有几种不同的方法可以做到这一点。一个非常干净的是:
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