了解一些Makefile语法

时间:2016-05-06 17:10:39

标签: shell makefile

我看到一个看起来像的Makefile:

TESTTMP = ./test-tmp

# VANILLA REDIS CONF
define VANILLA_CONF
daemonize yes
port 6379
dir .
pidfile redis_vanilla.pid
logfile redis_vanilla.log
save ""
appendonly no
endef

export VANILLA_CONF

.ONESHELL:   # what's it used for?
start: cleanup
    mkdir -p $(TESTTMP)
    cd $(TESTTMP)
    echo "$$VANILLA_CONF" | redis-server -  # what does this look like when expanded, equivalent to what command?

cleanup:
    rm -rf $(TESTTMP)

stop:
    kill `cat $(TESTTMP)/redis_vanilla.pid` || true  # what's "|| true"
    make cleanup

基本上我需要修改它以供我自己使用,但有一些我不太了解的行。我在代码中发表了评论。任何帮助,将不胜感激。感谢。

1 个答案:

答案 0 :(得分:3)

如果您想查看echo $$VANILLA_CONF的输出,只需删除| redis-server -,输出就会显示在屏幕上。

在这一行中,$被加倍作为在Makefile中“转义”它的方法:Make将echo $$VANILLA_CONF扩展为echo $VANILLA_CONF,并将其传递给shell,扩展 shell 变量VANILLA_CONF(在此上下文中常见的错误是忘记加倍$符号:如果该行代替echo $VANILLA_CONF,那么Make会尝试扩展 makefile 变量V,该变量未定义,将扩展为空,shell将收到令人困惑的字符串echo ANILLA_CONF

| redis-server -只是标准shell语法,表示pipelineecho命令回显到管道中的文本由程序standard input读取wikipedia page {1}}(不管是什么)。

redis-server shell连接器的意思是'或':如果(且仅当)||之前的命令失败,则执行后的命令。在这种情况下,||之后的命令是||,它始终成功。也就是说,即使true失败,stop规则中的这一行也会成功(还有其他方法可以在Makefile语法中表达这一点,但我认为这更清楚)。这也是标准的shell语法。

这看起来有点令人困惑,因为您必须能够识别什么是 make 语法以及什么是 shell 语法。使用'make'的基本思想是,在使用kill(或$(varname)扩展 make 变量之后,它将每个'规则'行发送到shell进程(罕见) )单字母变量$x和各种转义,例如x $$,如上所述)。您可能希望查看“make”的文档(enter image description here似乎有足够的详细信息来涵盖您需要的内容,但如果需要,则链接到更广泛的手册。)