2014-09-06 26 views
0

我正在寫一個GNU makefile來創建一個許可證文件,如下所示:如果客戶的文件存在然後將其複製到軟件包目錄,否則使用通用許可證。我有大約十幾個具有相同複製模式的文件。目標是將兩個互斥源文件中的一個複製到目標文件名。GNU make:友好的方式來選擇互斥文件

有沒有更好的方式來表達這與GNU make語法?這是我目前的。我考慮將所有GENERIC文件複製到目錄,然後覆蓋現有的CUST文件。

$(PDIR)/license.txt: | $(PDIR) 
    if [ -f Package/license.txt.$(CUST) ] ; \ 
    then \ 
     cat Package/license.txt.$(CUST) >$(PDIR)/license.txt ; \ 
    else \ 
     cat Package/license.txt.GENERIC >$(PDIR)/license.txt ; \ 
    fi 

編輯:感謝MadScientist的幫助。這是我的最終工作版本:

TARGETS = license.txt ... 
final: $(addprefix ${PDIR}/,${TARGETS}) 
    @echo some output 

$(foreach T,${TARGETS},$(eval ${PDIR}/$T: $(firstword $(wildcard Package/$T.${CUST} Package/$T.GENERIC Package/$T)) | ${PDIR})) 

$(addprefix ${PDIR}/,${TARGETS}): 
    @echo Creating substituted version of $< as [email protected] 
    @sed --expression="\ 
      ... \ 
     < '$<' \ 
     > '[email protected]' 

${PDIR}: 
    mkdir [email protected] 

回答

2

你可以使用通配符,然後(一如既往)你應該使用自動變量。就像這樣:

$(PDIR)/license.txt: $(firstword $(wildcard Package/license.txt.$(CUST) Package/license.txt)) | $(PDIR) 
     cat '$<' > '[email protected]' 

如果你有很多的這些,你也可以使用一個循環來定義目標:

TARGETS = license.txt 

$(foreach T,$(TARGETS),$(eval $(PDIR)/$T: $(firstword $(wildcard Package/$T.$(CUST) Package.$T) | $(PDIR)))) 

$(addprefix $(PDIR)/,$(TARGETS)): 
     cat '$<' > '[email protected]' 
+0

我讀的文檔,試圖瞭解發生了什麼事情。在第二個示例中,最後的make目標僅包含$ {TARGETS}中的第一個文件。我如何解決這個問題?另外,$(PDIR)沒有被創建,foreach中「| $(PDIR)」的目的是什麼? – ljdelight 2014-09-06 19:01:11

+0

沒關係,該foreach錯過了關閉paren,我把它放在了錯誤的地方。謝謝! – ljdelight 2014-09-06 19:18:42