第四章 规则的命令

命令回显
@echo 开始编译XXX模块...... 
显示 开始编译XXX模块......
echo 开始编译XXX模块......

显示 echo 开始编译XXX模块......

如果使用make的命令行参数“-n”或“--just-print” ,那么make执行时只显示所要执行的命令,但不会真正的去执行这些命令
make参数“-s”或“--slient”则是禁止所有执行命令的显示

命令的执行
在一个规则的命令中,命令行“cd”改变目录不会对其后的命令的执行产生影响。
foo : bar/lose 
     cd bar; gobble lose > ../foo 
这样写才会影响

make的递归执行 
subsystem: 
     cd subdir && $(MAKE)

相当于: subsystem: 
     $(MAKE) -C subdir 


在 make的递归调用中,需要了解变量“CURDIR”,此变量代表了 make当前的工作路径。如果使用“-C”选项进入一个子目录后,此变量将被重新赋值。总之,如果在 Makefile 中没有对此变量进行显式的赋值操作,那么它代表 make 的当前工作目录。我们也可以在 Makefile 为这个变量赋一个新的值。此时这变量将不再代表 make的工作目录。
变量MAKE
变量“MAKE”的值是“make”程序的文件名。如果其值为“/bin/make”那么上边规则的命令就为“cd subdir && /bin/make”。这样做的好处是:当我们使用一个其它版本的 make程序时,可以保证最上层使用的 make程序和其子目录下执行的 make保持一致。

两个特殊的变量“SHELL”和“MAKEFLAGS”除非使用指示符“unexport”对它们进行声明,否则在整个 make 的执行过程中它们会始终被自动的传递给子 make。另外一个变量“MAKEFILES”,如果此变量有值(不为空)那么同样他会被自动的传递给子 make。在没有使用关键字“export”声明的变量,make 执行时不会被自动传递给子 make过程,因此下层 Makefile中可以定义和上层同名的变量,这样不会引起变量定义冲突。
上层 Makefile 中定义的某一个变量需要传递给子 make 时,应该在上层 Makefile 中使用指示符“export”对此变量进行声明。格式如下: 
export VARIABLE ... 
当不希望将一个变量传递给子 make 时,可以使用指示符“unexport”来声明这个变量。格式如下:
unexport VARIABLE ... 

“-C”、“-f”、“-o”和“-W”这几个标志不能传递给子make

执行多级的 make调用时,如果不希望“MAKEFLAGS”的值传递给子 make,就需要在执行子 make时对它重新进行赋值。例如: 
subsystem: 
      cd subdir && $(MAKE) MAKEFLAGS= 
此规则取消了子 make执行式的命令行选项(将变量的值赋为空)。

你可能感兴趣的:(工作,shell,makefile)