2009-08-19 104 views
3

我更新從外部源訪問某些資源的一個Makefile,即存在形式變量的Makefile如果沒有設置

$(External)/% : 
    cvs up [email protected] 

的規則......如預期的無限制其中工程資源。現在,出現了一個特徵漂移和外部資源,需要更復雜的登錄,因此該規則已經改變的東西從這個沒有太多的不同:

$(External)/% : 
    cvs -d :pserver:$(CVSUSER)@cvs-server up [email protected] 

...這使得取決於變量規則CVSUSER。執行此操作的快速而簡單的方法是,如果未定義,則會放棄一條有用的錯誤消息。但這並不好玩,如果在需要的時候未設置,我想從控制檯讀取變量CVSUSER。我天真地試過

CVSUSER ?= $(shell read -p "User name: ") 

但這顯然不工作:)你會怎麼做呢?

回答

1

啊,當然,我需要一個簡單擴展型變量,而不是一個遞歸一個。這樣我可以讓變量依賴於自身,並使用普通的Make工具來有條件地設置它。有條件的分配隱式地創建一個正常(遞歸),所以我需要做的要麼

CVSUSER := $(shell if [ -z $(CVSUSER) ] ; then read -p "User name: " REPLY ; echo $$REPLY ; fi) 

ifndef CVSUSER 
    CVSUSER := $(shell then read -p "User name: " REPLY ; echo $$REPLY ; fi) 
endif 
3

$(shell)獲取shell命令的輸出。但read讀取變量中的輸入(缺省情況下爲REPLY),並不輸出它。這裏有一個快速的解決辦法:

CVSUSER ?= $(shell read -p "User name: ";echo $$REPLY) 
+0

儘管如此,將每個可變被訪問時調用外殼命令。當你做幾百個文件更新時,這並不好:) – Christoffer 2009-08-19 11:55:52

2

你已經自己找到了解決辦法,但我認爲這是一個壞練習創建一個makefile,該文件在調用之後的任何時候都依賴於用戶交互。這樣做會使構建更難集成到自動構建系統(例如,CruiseControl,AntHill等)中,並且使其難以集成到分佈式構建系統(pvmgmake等)中。

一個更好的辦法是立即把支票CVSUSER在調用生成文件包裝腳本,然後使生成文件退出與一個錯誤,如果CVSUSER沒有設置。

此致

埃裏克Melski

http://blog.electric-cloud.com

+0

如果Makefile不是用於軟件構建,而是用於簡化從模板創建各種配置文件(「run make here,它將生成虛擬機器爲你「),然後閱讀用戶輸入可能是合理的。當然,這不是一個常見的案例,但它是我以前見過的用例。 – 2014-05-01 22:35:28