LV112-控制函数
Makefile 中提供了两个控制 make 运行方式的函数。其作用是当 make 执行过程中检测到某些错误时为用户提供消息,并且可以控制 make 执行过程是否继续。
一、error
1. 语法格式
一般语法格式:
$(error <text ...>)该函数,并提示 <text ...> 信息给用户,并退出 make 的执行,该函数没有返回值。
error 函数是在函数展开时(函数被调用时)才提示信息并结束 make 进程。因此如果函数出现在命令中或者一个递归的变量定义时,读取 Makefile 时不会出现错误。而只有包含 error 函数引用的命令被执行,或者定义中引用此函数的递归变量被展开时,才会提示致命信息 <text ...> 同时退出 make 。
error 函数一般不出现在直接展开式的变量定义中,否则在 make 读取 Makefile 时将会提示致命错误。
2. 使用实例
2.1 读取时直接报错
Makefile 文件内容如下:
ERROR := E1
test:
ifdef ERROR
$(error error is $(ERROR))
endif然后在终端中执行 make test 命令,可以看到输出如下:
Makefile:4: *** error is E1。 停止。2.2 执行时报错
Makefile 文件内容如下:
ERROR=$(error found an error!)
.PHONY:error
error:
$(ERROR)然后在终端中执行 make error 命令,可以看到输出如下:
Makefile:4: *** found an error!。 停止。在 make 读取 Makefile 时不会出现致命错误,只有目标 error 被作为是一个目标被执行时才会出现。
二、warning 函数
1. 语法格式
一般语法格式:
$(warning <text ...>)该函数产生警告信息 <text ...> ,并且会打印出当前的行号。 make 的执行过程会继续。它返回值为空,用法和 error 类似,展开过程相同。
2. 使用实例
$(warning "first")
test:
$(warning "second")
@echo "test!"我们会得到如下打印信息:
sumu@virtual-machine:~/hk/alpha$ make
Makefile:1: "first"
Makefile:3: "second"
test!三、执行时机
warning和error两个函数在 Make 读取和解析 Makefile 阶段 执行的,而不是在 Shell 执行命令阶段。这意味着:
(1)即使它们写在 target 的 recipe(命令列表)中,只要 Make 解析到那一行(变量展开时),它们就会触发。
(2)我们无法像在 Shell 脚本中那样用 if 命令来控制它们是否在运行时触发(除非配合 Make 的条件判断函数)。
target_timing:
@echo "开始"
@$(warning 这行警告在 make 解析时就会打印,而不是等到 echo 执行后)
@echo "结束"当我们运行 make target_timing 时,警告信息会在 "开始" 之前就打印出来,因为 Make 在把命令交给 Shell 之前就已经展开并执行了 $(warning)。```
sumu@virtual-machine:~/hk/alpha$ make
Makefile:2: 这行警告在 make 解析时就会打印,而不是等到 echo 执行后
开始
结束