1447 words
7 minutes
【学习记录】makefile学习记录之完结篇:makefile运行与隐式规则

写在前面#

一不留神就过了个双节,本来就已经看完可以早早完结了硬是拖到现在,内心有些惭愧。

makefile的运行和其隐含规则虽然也比较关键但是在实际运用和书写的时候并不需要经常考虑到,其运行的话各种参数和功能等到用到的时候可以再查,没必要全部记下来,隐含规则的话很多时候只要书写规范也不必要考虑,makefile自然都会把推导做好,只要不要写出一些会让make困扰的规则让代码运行效率大幅降低就行了。而用makefile更新函数库文件的部分普通开发者也不太用得上,更何况初学的阶段,所以这里就省略不谈了,这部分内容也不多,真的要用到可以查阅一下。

makefile的运行#

一般情况下想要运行makefile只需要在其所在目录下使用命令行输入make指令即可自动运行各种规则和完成目标,只有在特殊情况下可能会指定一些参数,比如调试之类的情境下。

可能用到的一些参数#

1. -f/—file/—makefile#

用-f/—file/—makefile参数可以指定make执行特定的makefile文件,比如:

make -f mymakefile

也可以多次使用这个参数指定多个文件一并交给make执行

2. 指定目标#

默认情况下make自动完成的目标(target)就是makefile中定义的第一个目标(可以是伪目标),但是也可以在命令行中调用make的时候手动指定别的目标,只需要在make指令后跟上目标名即可,手动指定的目标会被make存放到一个名为MAKECMDGOALS的变量内,如果不手动指定那么变量的值为空。比如下面的makefile中有两个目标,一个是编译(foo.o),另一个是清除文件(clean),可以用make clean来让make单独执行清除文件的操作:

# makefile
foo.o : foo.c
    cc -c foo.c
 
clean :
    rm -f foo.o
 
# run
make clean

另外贴上一些作者陈皓建议的伪目标命名形式,规则是GUNmake中的,统一采用会更具有可读性和规范性:

  • all:这个伪目标是所有目标的目标,其功能一般是编译所有的目标。
  • clean:这个伪目标功能是删除所有被make创建的文件。
  • install:这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
  • print:这个伪目标的功能是例出改变过的源文件。
  • tar:这个伪目标功能是把源程序打包备份。也就是一个tar文件。
  • dist:这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。
  • TAGS:这个伪目标功能是更新所有的目标,以备完整地重编译使用。
  • check和test:这两个伪目标一般用来测试makefile的流程。

3. 其他参数#

这里不详细展开,需要时可以进行查阅,因为不常用。

make的退出状态#

make在执行完成后有三种退出状态码:

0:成功执行

1:运行时产生任何错误

2:如果使用了make的-q选项,并且make使得一些目标不需要更新

由于这里提到了-q选项,所以附上其用法:

-q--question:不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,如果是2则说明有错误发生。

make的隐含规则#

make的隐含规则其实就是make会自动推导一些你省略掉的规则,比如像用.c文件编译得到.o文件这种比较常见的操作,make会自动推导出相应的规则并执行,也就是说下面的两种写法都可以达成效果:

# method 1
foo : foo.o
    cc -o foo foo.o
 
foo.o : foo.c
    cc -c foo.c
 
# method 2
foo : foo.o
    cc -o foo foo.o

第二种写法中没有定义foo.o文件怎么生成,如果makefile所在的目录下没有foo.o这个文件,那么make会在自己的隐含规则库中按照规则定义的顺序寻找.o文件的来源应该是怎样的并且自动利用目录下有的文件生成依赖的.o文件,具体的规则定义顺序就不展开了,一般情况下只需要知道make会自动做这些事情即可,哪怕真的因为“隐含规则库”中的定义顺序导致了一些问题,大不了手动把一些规则写出来也行。

其他有关隐含规则的内容也不常见,一般可能也不会自己定义一些隐含规则,所以这里也不再展开,有需要的时候可以手动查阅相关用法。

后记#

第一次写学习记录的连续帖,感觉比以前自学稍微多些动力,也多些自己理解的地方,不知道以后能不能坚持学下去,cs的路好长,长的看不到方向,看不到尽头,希望能够慢慢摸索出一条自己的路吧。

也十分感谢像《跟我一起写Makefile》的作者陈浩、cs自学指南的作者这样无私分享教程路线方法的作者们,给想自学的cs学生指明一条道。

参考文章#

make 的运行 — 跟我一起写Makefile文档

【学习记录】makefile学习记录之完结篇:makefile运行与隐式规则
https://yinheee.pages.dev/posts/makefile-learning/makefile-5/
Author
TheColdSummer
Published at
2023-10-06