Makefile选项/规则来处理丢失/删除的源文件

时间:2010-05-17 03:56:22

标签: makefile

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}

1 个答案:

答案 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