代码之家  ›  专栏  ›  技术社区  ›  Christoffer

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

  •  3
  • Christoffer  · 技术社区  · 15 年前

    $(External)/% : 
        cvs up $@
    

    …对于不受限制的资源,它可以按预期工作。现在,出现了功能漂移,外部资源需要更复杂的登录,因此规则已更改为与此没有太大区别的内容:

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

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

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

    但这显然是行不通的:)你会怎么做?

    3 回复  |  直到 15 年前
        1
  •  3
  •   laalto    15 年前

    $(shell) 获取shell命令的输出。但是 read REPLY 默认情况下),并且不输出它。这里有一个快速解决方案:

    CVSUSER ?= $(shell read -p "User name: ";echo $$REPLY)
    
        2
  •  2
  •   Eric Melski    15 年前

    您自己已经找到了解决方案,但我建议,在调用后的任何时候创建依赖于用户交互的makefile都是一种不好的做法。这样做使构建更难集成到自动构建系统(例如CruiseControl、AntHill等),也使其更难集成到分布式构建系统(pvmgmake等)。

    更好的方法是检查 CVSUSER 在调用makefile的包装器脚本中,如果 没有设定。

    顺致敬意,

    埃里克·梅尔斯基

    http://blog.electric-cloud.com

        3
  •  1
  •   Christoffer    15 年前

    当然,我需要一个简单的扩展变量,而不是递归变量。这样,我可以让变量依赖于自身,并使用普通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