2010-07-21 50 views
3

這個問題在精神上類似於問題2543127gnu使許多文件複製到一個位置

我有一個gnu makefile文件和一個頭文件列表。每個頭文件可能位於不同的目錄,例如,

HEADERS = $(wildcard *.h) $(wildcard foo/*.h) $(wildcard bar/*.h) 

,我想有makefile的所有標題複製到包括目錄

INCDIR = ../include 

,當一個虛擬的目標,例如,所有被調用時,它會適當地更新在include目錄中的頭文件,即

.PHONY: ALL 
ALL : $(addprefix $(INCDIR)/,$(notdir $(HEADERS))) 

很顯然,我可以完成我想要的很容易,如果我知道哪些目錄名單WER即如果我這樣做的話,我可以寫一些規則(東西)像這樣(不完全正確,但你的JIST):

$(addprefix $(INCDIR)/,$(notdir $(filter foo/%.h,$(HEADERS)))) : %.h : foo/%.h 
    @cp -f $< [email protected] 

$(addprefix $(INCDIR)/,$(notdir $(filter bar/%.h,$(HEADERS)))) : %.h : bar/%.h 
    @cp -f $< [email protected] 

$(addprefix $(INCDIR)/,$(notdir $(filter-out bar/%.h,$(filter-out foo/%.h,$(HEADERS))))) : %.h : %.h 
    @cp -f $< [email protected] 

有兩個問題這種方法,(1)它變得繁瑣(2)我將它寫在一個makefile中include,它不知道目錄,它只知道變量INCDIR和HEADERS;它不直接知道foo /,bar /和./以外的目錄(通過$(dir $(HEADERS)))

問題:如何編寫規則以實現所需的效果僅提供INCDIR和HEADERS變量的約束。

回答

1

好的。答案很「容易」,儘管它需要使用一些我以前沒有用過的gnu make。我的解決方案創建了一個需要2個參數的子例程:(1)文件名(sans目錄)和(2)它所在目錄的名稱。 「子程序」是規則的模板。當一個人評估對子程序的調用時,就會啓動另一個規則,就像人們明確地寫了一樣。

define COPY_HEADER 
$$(INCDIR)/$(2) : $(1)$(2) 
    @cp -f $$< [email protected] 
endef 

然後,我們爲每個頭文件評估這個子例程,並傳入每個頭文件的目錄部分和文件部分。

$(foreach file,$(HEADERS),$(eval $(call COPY_HEADER,$(dir $(file)),$(notdir $(file))))) 
8

這應做到:

HFILES = $(notdir $(HEADERS)) 
DIRS = $(dir $(HEADERS)) 

TARGETS = $(addprefix $(INCDIR)/, $(HFILES)) 

all: $(TARGETS) 

$(INCDIR)/%.h: %.h 
    cp $< [email protected] 

vpath %.h $(DIRS) 
相關問題