makefile浅析,相关操作介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WZJwzj123456/article/details/82534049

1:显示命令

        通常,make 会把其要执行的命令行在命令执行前输出到屏幕上。当我们用“@”字符在命令行前,那么,这个命令将不被 make 显示出来。

        如果 make 执行时,带入 make 参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令,而 make 参数“-s”或“--slient”则是全面禁止命令的显示。

2:命令执行

        如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。比如你的第一条命令是 cd 命令,你希望第二条命令得在 cd 之后的基础上运行,那么你就不能把这两条命令写在两行上,而应该把这两条命令写在一行上,用
分号分隔。如: 
示例一: 
exec: 
cd /home/hchen 
pwd 

示例二: 
exec: 
cd /home/hchen; pwd 
        当我们执行“make exec”时,第一个例子中的 cd 没有作用,pwd 会打印出当前的Makefile 目录,而第二个例子中,cd 就起作用了,pwd 会打印出“/home/hchen”。

3:命令出错

        忽略命令的出错,我们可以在 Makefile 的命令行前加一个减号“-”(在 Tab 键之后),标记为不管命令出不出错都认为是成功的。如: 
clean: 
-rm -f *.o 
        还有一个全局的办法是,给 make 加上“-i”或是“--ignore-errors”参数,那么,Makefile 中所有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。 

        还有一个要提一下的 make 的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终止该规则的执行,但继续执行其它规则。 

4:嵌套执行make

        在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的 Makefile,这有利于让我们的 Makefile 变得更加地简洁,而不至于把所有的东西全部写在一个 Makefile 中,这样会很难维护我们的Makefile,这个技术对于我们模块编译和分段编译有着非常大的好处。 
 
        例如,我们有一个子目录叫 subdir,这个目录下有个 Makefile 文件,来指明了这个目
录下文件的编译规则。那么我们总控的 Makefile 可以这样书写: 
subsystem: 
cd subdir && $(MAKE) 
其等价于: 
subsystem: 
$(MAKE) -C subdir 
        定义$(MAKE)宏变量的意思是,也许我们的 make 需要一些参数,所以定义成一个变量较利于维护。这两个例子的意思都是先进入“subdir”目录,然后执行 make 命令。 

5:定义命令包

        如果 Makefile 中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以“define”开始,以“endef”结束,如: 
define run-yacc 
yacc $(firstword $^) 
mv y.tab.c $@ 
endef 
        这里,“run-yacc”是这个命令包的名字,其不要和 Makefile 中的变量重名。在“define”和“endef”中的两行就是命令序列。这个命令包中的第一个命令是运行 Yacc程序,因为 Yacc 程序总是生成“y.tab.c”的文件,所以第二行的命令就是把这个文件改改
名字。还是把这个命令包放到一个示例中来看看吧。 
 
foo.c : foo.y 
$(run-yacc) 
 
        我们可以看见,要使用这个命令包,我们就好像使用变量一样。在这个命令包的使用中,命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”(有关这种以“$”开头的特殊变量,上篇文章已经做过介绍)

猜你喜欢

转载自blog.csdn.net/WZJwzj123456/article/details/82534049