我更新从外部源访问某些资源的一个Makefile,即有如下形式的规则
$(External)/% :
cvs up $@
......如预期非受限资源,其工作原理。 现在,出现了一个特征漂移和外部资源,需要更复杂的登录,因此该规则已经改变的东西从这个没有太多的不同:
$(External)/% :
cvs -d :pserver:$(CVSUSER)@cvs-server up $@
......这使得取决于变量CVSUSER规则。 快速和简单的方法来执行,这将是如果它是不确定的有帮助的错误消息中止。 但是,这没有乐趣,我想阅读从控制台变量CVSUSER如果它是由它的所需要的时间未设置。 我天真的尝试
CVSUSER ?= $(shell read -p "User name: ")
但显然行不通:)你会如何去这样做?
$(shell)
抓住从外壳命令的输出。 但read
的变量(读取输入REPLY
默认情况下),不输出。 这里有一个快速的解决办法:
CVSUSER ?= $(shell read -p "User name: ";echo $$REPLY)
你已经找到自己的解决办法,但我建议,这是一个不好的做法,创建一个makefile是依赖于用户交互在任何时候被调用后。 这样做使得在构建更难集成到自动构建系统(例如,CruiseControl的,蚁窝等),并且还使得难以集成到分布式构建系统(pvmgmake等)。
更好的方法是把支票CVSUSER
立即调用生成文件包装脚本,然后使生成文件退出与一个错误,如果CVSUSER
未设置。
最好的祝福,
埃里克祈祷
http://blog.electric-cloud.com
啊,当然,我需要一个简单扩展型变量,而不是一个递归一个。 这样,我可以让变量取决于本身并使用有条件地设置其正常的制作工具。 有条件的分配隐式地创建一个正常(递归),所以我需要做的要么
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