4

我正在编写一个与 GHCi 和 gedit 一起使用的简单 Makefile。本质上,我定义了一个要加载的模块,以及一个要调用/测试的函数(连同它的参数)。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          


我怎么能干净优雅做到这一点?:)

4

2 回答 2

3

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

( echo ":l $(module)"; echo "$(function) $(params)" ) | ghci
于 2012-09-13T05:29:10.067 回答
1

即将发布的 GNU Make 版本将具有在类似情况下提供帮助的$(file)功能,尽管可能不完全是这个。

取而代之的是,基本方法是在关键时刻让换行符不是换行符:

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

define newline


endef

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

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

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

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

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

于 2012-09-13T07:49:34.297 回答