2011-10-17 24 views
0

學習make,在下面的Makefile中,如何定義%.tar.bz2的依賴性爲somefile.tar.bz2make:在依賴性中的文本函數

這將是這樣的: %.tar.bz2: $(function_to_cut_from_end_till_/ %.tar.bz2) 但我找不到如何做到這一點的man make

我從錯誤的一面接近這個嗎?

source=http://example.net/somefile.tar.bz2 
source:=$(subst :,\:,$(source)) 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "[email protected]" 
+1

:1.你在一個模式規則的先決條件使用任何功能都只有一次評估,*前*'%'佔位符被替換爲其他任何內容,並且2.即使忽略它,我也看不到'%.tar.bz2:$(function_to_cut_from_end_till_ /%.tar.bz2)'是一個有用的事情。你能解釋你試圖達到的結果嗎? – slowdog

+0

只是想用make,而不是shell來獲取文件名 - 你說得對,把它當作依賴是沒有任何意義的。我將在規則中使用'notdir'。 你會介意發佈它作爲答案,所以我可以接受它嗎? –

回答

1

削減爲了得到目標名稱的文件名部分內%.tar.bz2規則的命令,你可以使用the notdir function,或the $(@D) variable

儘管如此,您應該使目標名稱與輸出文件相匹配,以便make可以檢查文件的存在,並且每次運行時都不會嘗試重新下載它。一個簡單的方法來做到這將是

source=somefile.tar.bz2 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "http://example.net/[email protected]" 

,或者,如果你有不同的源檔案從不同的位置下載(我想像你這樣做,否則爲什麼有一個模板規則麻煩呢?),你可以使用一個target-specific variable存儲下載的URL,這樣的「function_to_cut_from_end_till_ /」的存在,被稱爲「notdir」,但

source=somefile.tar.bz2 some-other-file.tar.bz2 
somefile.tar.bz2: URL=http://example.net 
some-other-file.tar.bz2: URL=http://example.org/foobar 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "$(URL)/[email protected]" 
0

好了,沒有理由過於複雜 - 而有可能做到這一點,那豈不是更具可讀性做到這一點:

domain=http://example.net/ 
filename=somefile.tar.bz2 
source=$(DOMAIN)$(FILENAME) 

那麼文件名是正確的有使用

您也可以嘗試

$(patsubst %/,,$(source)) 

哪些應該刪除一切,直至最後向前從$(source)