754 words
4 minutes
【学习记录】makefile学习记录之一:初识makefile和基础规则

之前在课堂上接触到了makefile的概念,但是不清楚具体是什么,于是想着学一下,顺便记录一下学习历程,希望能坚持下去。另外,自学是看的《跟我一起写Makefile》。

基础规则#

targets : prerequisites
    command
    ...
targets : prerequisites ; command
    command
    ...

makefile的基础语法如上,刚开始看的时候不太能理解都代表什么,但是看了具体的例子之后会好理解很多。

foo.o: foo.c defs.h
    cc -c -g foo.c

这段代码表示makefile的目标是生成foo.o这个文件,即foo.o是最终追求的“targets”,而它依赖于foo.cdefs.h这两个文件,即“prerequisites”,如果foo.cdefs.h 的文件日期要比foo.o文件日期要新,或是foo.o不存在,那么代表“依赖关系发生”,就会执行下一行的shell命令(command)“cc -c -g foo.c”,其中规定命令必须以tab缩进为开头。

(另外贴一个新人可能不知道的小知识,学习cs的时候总是能看到foo,bar这些名称,一开始一直不知道代表什么,后来查了下发现就是一个比较随便的约定俗成的名称,比较详细的解释可以看这篇文章:http://t.csdn.cn/Xln1b)

​# 通配符 make支持三个通配符,分为是~*。以Linux操作系统举例,~代表用户的默认路径,*代表匹配任意个数的任意字符(包含0个),代表匹配单个任意字符。

在文件搜寻的部分,make使用VPATH定义额外寻找文件的路径,其中也有一个类似通配符作用的符号,即百分号%。它的意义跟常见的*一样,代表匹配任意个数的任意字符(包含0个)。

举例:

vpath %.h ../headers

这一行表示在../headers文件夹下寻找所有后缀为.h的文件(如果某文件在当前目录没有找到的话)。

文件搜寻#

​文件搜寻分为VPATH和vpath,其中前者可以理解为变量,就像Linux下的PATH环境变量一样,后者可以看作一种命令。

如果定义了VPATH变量,那么,make就会在当前目录找不到的情况下,到所指定的目录中去找寻文件。

举例:

VPATH = src:../headers

其中多个路径之间用冒号分隔(这与Linux下的PATH环境变量相同)。

vpath有三种用法:

vpath <pattern> <directories>   # 1

为符合模式的文件指定搜索目录

vpath <pattern> # 2

清除符合模式的文件的搜索目录。

vpath   # 3

清除所有已被设置好了的文件搜索目录。

vpath使用方法中的需要包含 % 字符。

vpath可以连续写多行,如:​

vpath %.c dir1
vpath %.c fir2
vpath %.c fir3

结语#

第一次记录就先到这里,因为时间有限只是非常简单的看了下介绍和第一部分内容,后面接着是伪目标,等下次多看些再写了。

【学习记录】makefile学习记录之一:初识makefile和基础规则
https://yinheee.pages.dev/posts/makefile-learning/makefile-1/
Author
TheColdSummer
Published at
2023-09-21