1. 显示命令

make工具要把执行的命令行在命令执行前输出到屏幕上。当使用@字符在命令行前,这个命令将不被make工具显示出来,可以利用这个功能向屏幕输出一些信息,如下所示:

@echo compling...

当make执行时,会在屏幕上输出“compling...”的字符串,但是不会输出“@echo compling...”命令。如果将@符号去掉,make工具在执行makefile文件时会将“echo compling...”命令本身输出,如下:

在makefile文件中编辑:

tar :
	echo compling...

执行:

makefile 里面使用echo makefile @echo_shell

如果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文件:

makefile 里面使用echo makefile @echo_python_02

需要注意的是,如果要使上一条命令的结果应用在下一条命令时,应当使用“;”分隔这两条命令。下面比较说明shell命令的执行结果问题。

编辑makefile文件如下:

exec :
	cd /home/daowm
	pwd
.PHONY : exec

执行:

makefile 里面使用echo makefile @echo_命令行_03

编辑makefile文件如下:

exec :
	cd /home/daowm; pwd
.PHONY : exec

执行:

makefile 里面使用echo makefile @echo_shell_04

执行两个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