本系列文章均翻译自Autoconf官方文档:Autoconf Manual,github同步项目:question
M4sh
,称作mash,目的是产生便携式可移植 Bourne shell 脚本。因为不同的shell的语法不兼容,故创造此种宏来解决。
其宏以AS_
开头。在shell和环境变量中保留了变量命名空间as_
,输出文件中是_AS[A-Z]
。
9.1 普通的shell结构
AS_IF (test1, [run-if-true1], …, [run-if-false])
如果没有一个测试是成功的,执行run-if-false。
AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],[test "x$foo" != xno], [HANDLE_FOO([maybe])],[echo foo not specified])
AS_TR_CPP (expression)
将expression转为C的宏定义
# This outputs "#define HAVE_CHAR_P 1".# Notice the m4 quoting around #, to prevent an m4 commenttype="char *"echo "[#]define AS_TR_CPP([HAVE_$type]) 1"
9.2 间接变量名的支持
AS_LITERAL_IF (expression, [if-literal], [if-not], [if-simple-ref = ‘if-not’])
AS_LITERAL_WORD_IF (expression, [if-literal], [if-not], [if-simple-ref = ‘if-not’])
若expression定义为shell文本,输出if-literal;若expression包含了shell引用或者调用(例如$var或cd
),输出if-not。
expression为文本的时候,AS_LITERAL_WORD_IF
不允许expression含有空格,但是AS_LITERAL_IF
可以。
AS_VAR_APPEND (var, text)
相当于var += text
,即var=${var}text
。
AS_VAR_IF (var, [word], [if-equal], [if-not-equal])
输出shell的条件语句。var==word,执行if-equal;否则执行if-not-equal。
word必须是单个shell单词。