1. 显示命令
make工具要把执行的命令行在命令执行前输出到屏幕上。当使用@字符在命令行前,这个命令将不被make工具显示出来,可以利用这个功能向屏幕输出一些信息,如下所示:
@echo compling...
当make执行时,会在屏幕上输出“compling...”的字符串,但是不会输出“@echo compling...”命令。如果将@符号去掉,make工具在执行makefile文件时会将“echo compling...”命令本身输出,如下:
在makefile文件中编辑:
tar :
echo compling...
执行:
如果make工具执行时,make参数是-n或--just-print,则可以只显示命令,但是不会执行命令,用户可以利用这个功能调试makefile文件,命令在make过程中执行的顺序。
make参数是-s或--slient,则禁止所有命令的显示,不论该命令前是否有@符。
2.执行命令
当一个规则被执行时,make工具会一条一条地执行规则后面定义的命令。这些命令可以是shell中可以运行的命令,也可以是一个用户自己的可执行程序。下面实例演示了在makefile中使用命令,该makefile调用一个当前目录下的应用程序:
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
编译该程序:
gcc hello.c -o hello
编辑makefile文件:
all :
ls
./hello
.PHONY : all
执行makefile文件:
需要注意的是,如果要使上一条命令的结果应用在下一条命令时,应当使用“;”分隔这两条命令。下面比较说明shell命令的执行结果问题。
编辑makefile文件如下:
exec :
cd /home/daowm
pwd
.PHONY : exec
执行:
编辑makefile文件如下:
exec :
cd /home/daowm; pwd
.PHONY : exec
执行:
执行两个makefile时,第一个例子中的cd没有起作用,pwd会打印当前的makefile目录。而第二个例子中,cd就起作用了,pwd会打印出新进入的目录。
3.命令出错
每当命令执行完后,make、工具会检测每个命令的返回码。如果命令返回成功,make工具会执行下一条命令。当规则中所有的命令成功返回后,这个规则就算是成功完成了。如果规则中的某个命令出错了(命令退出码非0),make工具就会终止执行当前规则,并有可能终止所有的规则。
有些时候,命令的出错并不表示就是错误的。例如mkdir命令,使用该命令的目的就是一定要保证建立一个目录。如果目录不存在,那么mkdir就成功执行,但如果目录存在,那么该命令就会出错。有些时候用户并不希望因为mkdir命令出错而终止整个规则的运行。
因此需要忽略命令的出错。make工具支持在规则的命令行前加一个减号“-”,忽略对该命令执行结果的判断,如下:
clean:
-rm -f *.c
上例表示即使rm命令出错,该规则也会执行,而不会停止执行该规则。
make的参数-i或者--ignore-errors可以使makefile文件中所有命令都忽略错误,如果一个规则是以 .IGNORE声明作为目标的,那么这个规则中的所有命令都将忽略错误,如下所示:
clean:
rm -f *.c
.IGNORE : clean