如何将多行输入(stdin)传递给我在Makefile中执行的命令?

时间:2012-09-13 00:44:17

标签: makefile stdin

我正在编写一个简单的Makefile,用于GHCi和gedit。本质上,我定义了一个要加载的模块,以及一个函数(及其参数)来调用/测试。 Makefile需要执行GHCi,然后将必要的命令传递给它。我尝试使用echo滚动,并且它在普通的shell中工作,但由于make处理空格,字符串和放大器的方式而失败。格式。它将整个事物作为一条线输入,而不是单独的输入线。最重要的是,它有点乱。

# Sorry if backslashes are messed up do to tabs...
module   = somemodule
function = somefunction
params = 5 "Hello"

default: *.hs
    echo                \
        :l $(module)        \
                    \
        $(function) $(params)   \
        | ghci          


我怎样才能干净利落地 :)

2 个答案:

答案 0 :(得分:3)

您是否尝试过使用两个单独的echo命令?

( echo ":l $(module)"; echo "$(function) $(params)" ) | ghci

答案 1 :(得分:1)

即将推出的GNU Make版本将有一个$(file) function来帮助处理类似情况,但可能不是这个。

代替这一点,基本方法是在关键时刻让换行符不是新行:

define boilerplate
:l $(module)
$(function) $(params)
endef

define newline


endef

default: *.hs
    echo '$(subst $(newline),|,$(boilerplate))' | tr '|' '\n' | ghci

(该$(newline)定义的源文本包含两个空行,因为defineendef之前吃了一个尾随换行符。)

如果您不能假设GNU Make,因此没有substdefine,您可以直接在echo命令中编写| - 编码的换行符:

default: *.hs
    echo ':l $(module)|$(function) $(params)' | tr '|' '\n' | ghci

......在这一点上,这只是一个品味问题,这是否比Idelic的子壳建议更好或更差。