2017-10-09 65 views
0

我試圖得到一些相關的安裝目標,在我的Makefile文件的工作方式如下:GNU Linux的Makefile的假目標相關工作不正常

.PHONY: install-everything install-part1 install-part2 

install-everything: install-part1 install-part2 

install-part1: 
    $(call part1-function) 

install-part2: 
    $(call part2-function) 

這是非常相似的,這裏的GNU製作手冊中描述: https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html

我做

make install-part1 

第一,然後手動(即室射頻)移除得到創建的$(DESTDIR)目錄。現在

,每次我嘗試運行上面列出的任何目標,我得到e.g:

make: nothing to be done for 'install-everything'. 

我得到同樣的答案,如果我試圖強行讓與「-B」標誌。如果我添加調試信息(請--debug)我得到

File 'install-everything' does not exist. 
Must remake target 'install-everything'. 

我認爲使用.PHONY指令會解決這個問題 - 誰能幫助?

+1

這可能是因爲你的'$(調用partX功能)'擴大到什麼。如果是這樣,所有食譜都是空的,你得到的消息是正確的:沒有什麼可做的。請顯示您的'partX-function'宏的例子。 –

+0

它只是創建一些目錄,然後複製東西: define install-part1: $(mkdir -p $(1)) $(cp -r files $(1)) endef – user12066

回答

3

您的partX-function宏,如您在註釋中解釋的那樣,展開爲空字符串。他們做什麼被調用時,他們如何擴大是兩個不同的東西。因此,您的食譜都是空的,並通過它的nothing to be done消息告訴你。分析你的宏並發現他們做了一些事情並不夠智能。您使用GNU make及其功能非常規。爲您展示的例子中,這將是更好的使用普通的化妝(除非你有很多文件的安裝和性能問題):

.PHONY: install-everything install-part1 install-part2 

install-everything: install-part1 install-part2 

install-part1: $(addprefix $(DIR1)/,$(FILES1)) 

$(DIR1): 
    mkdir -p [email protected] 

$(addprefix $(DIR1)/,$(FILES1)): $(DIR1)/%: $(SRCDIR)/% | $(DIR1) 
    cp -f $< [email protected] 

install-part2:... 

(假設使變量SRCDIRDIR1FILES1定義源目錄,分別爲install-part1的目的地目錄和要複製的文件列表install-part1)。

爲了充分了解這個示例makefile,您需要了解static pattern rulesorder-only prerequisites

如果你有大量的文件,安裝和性能重要,最好是組副本(cp),從而降低外殼調用次數:

install-part1: $(addprefix $(SRCDIR)/,$(FILES1)) | $(DIR1) 
    for f in $(FILES1); do \ 
     cp -f $(SRCDIR)/$$f $(DIR1);\ 
    done 

甚至:

install-part1: $(addprefix $(SRCDIR)/,$(FILES1)) | $(DIR1) 
    cp -f $^ $(DIR1) 

它不那麼優雅,因爲所有依賴關係都沒有正確聲明。每次調用make install-part1時,所有文件都會被複制,即使它們已經安裝並且是最新版本的,但它應該比其他解決方案快得多。

最後但並非最不重要的:GNU/Linux下安裝經常使用的install效用,而不是cp ......