如果未设置,则从控制台读取Makefile变量

时间:2009-08-19 10:00:27

标签: shell makefile

我正在更新一个从外部源访问某些资源的Makefile,即有一个表格规则

$(External)/% : 
    cvs up $@

...无限制资源的预期效果。现在,有一个功能漂移,外部资源需要更复杂的登录,所以规则已经变成了与此不太相似的东西:

$(External)/% : 
    cvs -d :pserver:$(CVSUSER)@cvs-server up $@

...这使得规则依赖于变量CVSUSER。执行此操作的快速简便方法是在未定义的情况下中止有用的错误消息。但这并不好玩,我想从控制台读取变量CVSUSER,如果它在需要的时候没有设置。我天真地试过

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

但这显然不起作用:)你会怎么做呢?

3 个答案:

答案 0 :(得分:3)

$(shell)获取shell命令的输出。但是read读取变量中的输入(默认为REPLY)并且不输出它。这是一个快速修复:

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

答案 1 :(得分:2)

您已经自己找到了解决方案,但我建议创建一个在调用后随时依赖用户交互的makefile是一种不好的做法。这样做会使构建更难以集成到自动构建系统(例如,CruiseControl,AntHill等)中,并且使得集成到分布式构建系统(pvmgmake等)变得更加困难。

更好的方法是将CVSUSER的检查放入调用makefile的包装器脚本中,如果未设置CVSUSER,则立即退出makefile并返回错误。

致以最诚挚的问候,

Eric Melski

http://blog.electric-cloud.com

答案 2 :(得分: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