Makefile: (实验) 目标命令的结束标志

实验表示测试出来的结论,没有代码理论依据

Makefile中,目标对应的命令结束标记是什么呢?换句话说,Make中怎么判断目标的最后一条命令?

例如常见的目标编写如下:

Copy
test1: echo "test1" echo "test without empty line"

那如果目标下空一行呢?

Copy
test2: echo "test2" echo "test with emtpy line"

如果目标命令还掺杂了ifeq,define,ifndef呢?

Copy
test3: echo "test3" echo "test with emtpy line" ifneq (DEBUG, ) echo "test with ifneq" endif

这可能是一个非常“幼稚”的问题,以至于找到的学习资料都没有描述,却着实让我迷惑了一段时间。


实验结论:

  1. 空行、ifeq、define、ifndef等并不作为命令集的结束
  2. 新的目标或者定义变量会识别为命令集的结束

换句话说:

一条目标的命令集会一直往下检索,直到遇到非命令相关的部分(例如其他目标,变量定义等)


测试1:

Copy
var=val cmd6="cmd 6" test1: @echo "-- target 1 --" @echo cmd 1 @echo cmd 2 ifdef var @echo cmd 3 endif define common @echo cmd 4 endef $(call common) @echo cmd 5 @echo ${cmd6} test2: @echo "-- target 2 --"

执行结果:

Copy
[GMPY@09:14 tmp]$make test1 -- target 1 -- cmd 1 cmd 2 cmd 3 cmd 4 cmd 5 cmd 6

不管目标下是否有空行、ifdef等,依然是归属为同一个目标的命令

测试2:

Copy
var=val cmd6="cmd 6" test1: @echo "-- target 1 --" TEST=TEST @echo cmd 1 test2: @echo "-- target 2 --"

执行结果:

Copy
[GMPY@09:19 tmp]$make test1 Makefile:7: *** commands commence before first target。 停止。
posted @   广漠飘羽  阅读(651)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示