如何将命令输出分配给GNU make target规则中的变量?

时间:2012-07-03 17:35:07

标签: gnu-make sh

在BASH提示符下,我可以执行以下操作:

~/repo$ HISTORY_LOG=$(git log $(get_old_version)..$(get_new_version)); [[ ! -z ${HISTOR_LOG} ]] && ( echo "Some header"; echo "${HISTORY_LOG}" )

git log显然是我实际拥有的简化版本。

在make文件中,我将以下命令作为目标的一部分:

$(OUTPUT): $(INPUT)
        ...
        echo "Some header" > $(LOG_FILE)
        git log $(shell get_old_version)..$(shell get_new_version) >> $(LOG_FILE)

如何重写make target以使其像bash命令一样?

如果我这样做,则会删除以下换行符:

$(OUTPUT): $(INPUT)
        ...
        HISTORY_LOG="$(shell git log $(shell get_old_version)..$(shell get_new_version))" ; \
           [ -z "$${HISTORY_LOG}" ] && \
             true || \ 
             (echo "Some header" ; echo "$${HISTORY_LOG}" )

运行时如下:

~/repo $ make
commit 2b4d87b0e64d129028c1a7a0b46ccde2f42c5e93     Author: Jamie   <Jamie@mymail.com>   Date:   Mon Jun 25 18:46:27 2012 -0400              Issue #468: This sucker's been sped up.

我更喜欢的是:

~/repo $ make
commit 2b4d87b0e64d129028c1a7a0b46ccde2f42c5e93     
Author: Jamie   <Jamie@mymail.com>
Date:   Mon Jun 25 18:46:27 2012 -0400 

    Issue #468: This sucker's been sped up.

我认为问题在于make执行/bin/sh而不是/bin/bash的命令。无论我是否正在寻找便携式解决方案,如果有的话。

1 个答案:

答案 0 :(得分:5)

Make shell正在吃你的换行符。只是停止使用它。而不是$( shell get_old_version ),而不是$

$$( get_old_version )