2009-08-19 106 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