将shell(CYGWIN)命令的输出分配给Make变量

时间:2011-12-24 10:44:31

标签: makefile

我想将shell命令的输出分配给make变量。 这就是我的尝试:

phonegap:
    #download new phonegap
    cd ${SOURCE_PHONEGAP};git pull
    PHONE_VER = $(shell cat d:/path/to/workspace/common/phonegap/VERSION)
    echo phonegap version: ${PHONE_VER}

从命令行运行MAKE时,我得到以下内容:

  

PHONE_VER = 1.3.0   make:PHONE_VER:找不到命令    所以shell字符串被转换为正确的值(1.3.0),但之后就失败了。

我也试过声明:

PHONE_VER = 

然后在命令中:         $ {PHONE_VER} = $(shell cat d:/ path / to / workspace / common / phonegap / VERSION) 或使用:=或+ =。没用?

我正在使用GNU make 3.81

的cygwin(在win 7上)

我找到this question并回答 - 但这对我来说似乎不起作用。 我显然错过了一些东西(可能是基本的),但经过一天的实验后,我不知道丢失的部分是什么。

2 个答案:

答案 0 :(得分:7)

您无法在规则配方中分配变量。 第一种可能的解决方案是在规则之外的某处初始化它,然后将其用作常规:

PHONE_VER = $(shell cat d:/path/to/workspace/common/phonegap/VERSION)

phonegap: pull_phonegap
    @echo phonegap version: ${PHONE_VER}

pull_phonegap:
    @cd ${SOURCE_PHONEGAP}; git pull

只要递归展开PHONE_VER,就可以正常工作(注意=签到分配),shell cat ...的实际调用将在满足pull_phonegap后显示先决条件。

另一种可能性是为PHONE_VER制作target-specific变量phonegap

phonegap: PHONE_VER = $(shell cat d:/path/to/workspace/common/phonegap/VERSION)
phonegap: pull_phonegap
    @echo phonegap version: ${PHONE_VER}

最后,如果您要做的唯一事情就是打印已下载的​​repo版本,那么根本不需要删除变量:

phonegap: pull_phonegap
    @echo phonegap version:
    @cat ${SOURCE_PHONEGAP}/VERSION

pull_phonegap:
    @cd ${SOURCE_PHONEGAP}; git pull

答案 1 :(得分:1)

由于配方在shell中运行,您可以通过&&:

组合命令
PHONE_VER=`cat d:/path/to/workspace/common/phonegap/VERSION` && echo phonegap version: $${PHONE_VER}

不要忘记使用$$而不是单个$