“.exe”、“ .com”、“ .bat”、“ .sh”等后缀。
三、命令出错
每当命令运行完后,make 会检测每个命令的返回码,如果命令返回成功,那么 make 会执
行下一条命令,当规则中所有的命令成功返回后,这个规则就算是成功完成了。如果一个
规则中的某个命令出错了(命令退出码非零),那么 make 就会终止执行当前规则,这将
有可能终止所有规则的执行。
有些时候,命令的出错并不表示就是错误的。例如 mkdir 命令,我们一定需要建立一个目
录,如果目录不存在,那么 mkdir 就成功执行,万事大吉,如果目录存在,那么就出错了。
我们之所以使用 mkdir 的意思就是一定要有这样的一个目录,于是我们就不希望 mkdir 出
错而终止规则的运行。
为了做到这一点,忽略命令的出错,我们可以在 Makefile 的命令行前加一个减号“-”(在
Tab 键之后),标记为不管命令出不出错都认为是成功的。如:
clean:
-rm -f *.o
还有一个全局的办法是,给 make 加上“-i”或是“--ignore-errors”参数,那么,Makefile 中所
有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所
有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢
设置。
还有一个要提一下的 make 的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某
规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。
四、嵌套执行 make
在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我
们可以在每个目录中都书写一个该目录的 Makefile,这有利于让我们的 Makefile 变得更加
地简洁 ,而不至于把 所有的东西 全 部写在一个 Makefile 中,这样会 很难维护我们 的
Makefile,这个技术对于我们模块编译和分段编译有着非常大的好处。
例如,我们有一个子目录叫 subdir,这个目录下有个 Makefile 文件,来指明了这个目录下
文件的编译规则。那么我们总控的 Makefile 可以这样书写:
subsystem:
cd subdir && $(MAKE)
其等价于:
subsystem:
$(MAKE) -C subdir
定义$(MAKE)宏变量的意思是,也许我们的 make 需要一些参数,所以定义成一个变量比
较利于维护。这两个例子的意思都是先进入“subdir”目录,然后执行 make 命令。
我们把这个 Makefile 叫做“总控 Makefile”,总控 Makefile 的变量可以传递到下级的 Makefile
中(如果你显示的声明),但是不会覆盖下层的 Makefile 中所定义的变量,除非指定了“-
e”参数。
如果你要传递变量到下级 Makefile 中,那么你可以使用这样的声明:
export <variable ...>
如果你不想让某些变量传递到下级 Makefile 中,那么你可以这样声明: