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

用于处理丢失/删除的源文件的Makefile选项/规则,makefile,Makefile,提供一些有关如何处理已删除的源文件以生成.o文件的指针。我使用的是gcc/g++,因此在生成依赖项时添加-MP选项对我来说非常有用,直到我使用.a文件进入链接阶段 当输入源消失时,如何更新档案/库?这对我来说还可以,但是有没有更干净的方法(例如,像g++-MP选项这样简单的方法) 在初始反馈后更新了以下内容: LIBATLS_HAS := $(shell $(AR) t ${BUILD_DIR}/libatls.a) LIBATLS_REMOVE := $(filter-out $(notdir

提供一些有关如何处理已删除的源文件以生成.o文件的指针。我使用的是gcc/g++,因此在生成依赖项时添加-MP选项对我来说非常有用,直到我使用.a文件进入链接阶段

当输入源消失时,如何更新档案/库?这对我来说还可以,但是有没有更干净的方法(例如,像g++-MP选项这样简单的方法)

在初始反馈后更新了以下内容:

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}

有几种不同的方法可以做到这一点。一个相当干净的是:

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

谢谢你的反馈。我仍然希望有一个更直接的方法这似乎是一个普遍的问题。我喜欢nm | grep | sed上的“$(AR)t”。我必须过滤存档的目录(下面的过滤器%.o)。第二个版本应该使用LIBATLS_REMOVE,对吗?使用组合版本更新以上内容。@b3nj1:我认为没有更直接的方法不涉及危险的黑客。你可以列出make可能拥有的特性,但是一个能够非常干净地处理这个问题的make将是一种通用语言。
# 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