2010-05-17 71 views
1

Need a makefile dependency rule that can handle missing files給出了關於如何處理刪除的源文件以生成.o文件的一些指示。我使用的是gcc/g ++,因此在生成依賴關係時添加-MP選項對我來說很好,直到我到達鏈接階段並使用我的.a文件...Makefile選項/規則處理丟失/刪除的源文件

如何在輸入源時更新歸檔/庫走開?這對我來說工作正常,但是有沒有更簡潔的方法(即,像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 [email protected] ${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

有幾種不同的方式來做到這一點。一說是相當乾淨的是:

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 
+0

感謝您的反饋意見。我仍然希望以更直接的方式。 :)這似乎是一個普遍的問題。 我喜歡nm | grep | sed上的「$(AR)t」。我必須過濾存檔的目錄(下面的過濾器%.o)。 第二個版本應該使用LIBATLS_REMOVE,是否正確? 使用組合版本更新以上版本。 – b3nj1 2010-05-17 20:04:18

+0

@ b3nj1:我不認爲有一種更直接的方式,不涉及危險的黑客行爲。人們可以製作Make的功能列表,但Make可以真正乾淨地處理這個問題的Make是一種通用語言。 – Beta 2010-05-18 00:08:07