makefile中的shell语法

makefile中的shell语法,makefile,Makefile,我在linux内核的Makefile中看到了上述内容 在大多数其他脚本语言AFAIK中,它看起来不像常规的if语句 甚至在其他地方也没有endif结束标记 它是如何工作的? 这是可能的,并且有一个endif(最终你需要一些东西来关闭条件块;如果没有,我想文件的其余部分就是条件块的一部分)。与其他语言中常见的常规条件的唯一真正区别在于,这些条件只计算一次——在实际执行makefile之前。所以它们就像预处理器定义,而不像真正的脚本语言。我不确定这一点得到了多大程度的支持(即,在非GNU的情况下,做

我在linux内核的
Makefile
中看到了上述内容

在大多数其他脚本语言AFAIK中,它看起来不像常规的
if
语句

甚至在其他地方也没有
endif
结束标记

它是如何工作的?


这是可能的,并且有一个endif(最终你需要一些东西来关闭条件块;如果没有,我想文件的其余部分就是条件块的一部分)。与其他语言中常见的常规条件的唯一真正区别在于,这些条件只计算一次——在实际执行makefile之前。所以它们就像预处理器定义,而不像真正的脚本语言。我不确定这一点得到了多大程度的支持(即,在非GNU的情况下,做出替代方案)。但这看起来是一个有趣的替代方法,可以代替使用shell脚本/configure/cmake/等来实现简单的条件和决策。

ifeq
检查这两个语句是否相等。由于第二条语句为空,该语句基本上检查
$KBUILD\u SRC
是否为空/未设置。通过将
ifeq
替换为
ifneq
可以检查变量是否已设置

endif
必须在某个地方,否则会出现语法错误,
make
会抱怨


而且。。。如前所述,make使用两个阶段,第一个阶段解析Makefile并展开所有宏、include等。它还计算条件。因此,之后将根据条件和其他包含的makefile创建所有目标。在第二阶段,make使用目标及其依赖项(在其他目标上)实际执行命令(例如构建内核)。遇到的第一个目标被用作“父目标”,除非make命令包含一个或多个“父目标”

-您具体不了解什么?(在它后面的某个地方有一个
endif
。可能不完全是你期望的地方。)你知道
$(if$(KBUILD\u EXTMOD),:$(KBUILD\u EXTMOD))
的意思吗?当设置了
$(KBUILD\u EXTMOD)
时(即它包含一些内容),命令将返回
:$(KBUILD\u EXTMOD)
,否则什么也没有。它可以用来填充另一个变量或提供命令的参数(一种内联if语句)。同样,在执行实际目标/命令之前,它被处理为我描述的“阶段1”。在
:$(KBUILD_EXTMOD)
的意思是什么?没有任何特定于/MakeFile的东西,即以某种方式使用它的变量/命令。您应该询问内核开发人员或检查它在哪里使用
ifeq ($(KBUILD_SRC),)