从控制台读取的Makefile变量,如果没有设置(Read Makefile variable fr

2019-08-01 16:35发布

我更新从外部源访问某些资源的一个Makefile,即有如下形式的规则

$(External)/% : 
    cvs up $@

......如预期非受限资源,其工作原理。 现在,出现了一个特征漂移和外部资源,需要更复杂的登录,因此该规则已经改变的东西从这个没有太多的不同:

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

......这使得取决于变量CVSUSER规则。 快速和简单的方法来执行,这将是如果它是不确定的有帮助的错误消息中止。 但是,这没有乐趣,我想阅读从控制台变量CVSUSER如果它是由它的所需要的时间未设置。 我天真的尝试

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

但显然行不通:)你会如何去这样做?

Answer 1:

$(shell)抓住从外壳命令的输出。 但read的变量(读取输入REPLY默认情况下),不输出。 这里有一个快速的解决办法:

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


Answer 2:

你已经找到自己的解决办法,但我建议,这是一个不好的做法,创建一个makefile是依赖于用户交互在任何时候被调用后。 这样做使得在构建更难集成到自动构建系统(例如,CruiseControl的,蚁窝等),并且还使得难以集成到分布式构建系统(pvmgmake等)。

更好的方法是把支票CVSUSER立即调用生成文件包装脚本,然后使生成文件退出与一个错误,如果CVSUSER未设置。

最好的祝福,

埃里克祈祷

http://blog.electric-cloud.com



Answer 3:

啊,当然,我需要一个简单扩展型变量,而不是一个递归一个。 这样,我可以让变量取决于本身并使用有条件地设置其正常的制作工具。 有条件的分配隐式地创建一个正常(递归),所以我需要做的要么

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


文章来源: Read Makefile variable from console if not set