《跟我一起学makefile》学习笔记(二)

学习记录(对应文档的p10-p20)

四、使用变量
edit的规则
edit:main.o kbd.o display.o \
insert.o search.o files.o utils.o
    cc -o edit main.o kbd.o command.o display.o \
    insert.o search.o files.o utils.o
    存在的问题,.o文件的字符串被重复了2次。因此需要变量(理解成c中的宏)
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
使用$(objects)
改良版的makefile
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

edit:$(objects)
    cc -o edit $(objects)
main.o:main.c defs.h
    cc -c main.c
    ......
clean:
    rm edit $(objects)
五、让make自动推导
make看到.o文件,自动把.c文件加在依赖关系中
新的makefile
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

edit:$(objects)
    cc -o edit $(objects)
main.o:defs.h
kbd.o:defs.h command.h
    ......

.PHONY:clean
clean:
    rm edit $(objects)
其中.PHONY表示,clean是伪目标文件
六、另类风格的makefile
解决的问题:重复的.h文件
make自动推导命令和文件
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

edit:$(objects)
    cc -o edit $(objects)
    
$(objects):defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o: buffer.h

.PHONY:clean
clean:
    rm edit $(objects)
七、清空目标文件的规则
    .PHONY:clean
clean:
    -rm edit $(objects)
减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。
第四部分、Makefile总述
一、Makefile里有什么?
    显式规则、隐晦规则、变量定义、文件指示、注释
1、显式规则
    书写者明显指出,要生成的文件、依赖的文件、生成的命令
2、隐晦规则
    make自动推导
3、变量的定义
    变量一般都是字符串
4、文件指示
    (1)在一个Makefile中引用另一个Makefile,类似include
    (2)根据某些情况指定Makefile中的有效部分,类似预编译#if
    (3)定义一个多行的命令
5、注释
    只有行注释,#开头。如果你要在你的 Makefile 中使用“#”字符,可以用反斜框进行
转义,如:“\#”。
二、Makefile的文件名
    首选Makefile,也行makefile
    别的文件名“Make.Linux”,使用 make 的“-f”和“--file”参数,如:make -f Make.Linux
三、引用其他的Makefile
    include
    在include前面可以有空字符,决不能以Tab开始
    例子:几个 Makefile文件:a.mk、b.mk、c.mk,还有一个文件:foo.make,
    以及一个变量$(bar),其包含了 e.mk 和f.mk。  
include foo.make *.mk $(bar)  
等价于:  
include foo.make a.mk b.mk c.mk e.mk f.mk

    make 命令开始时,会把找寻 include 所指出的其它 Makefile。
    如果文件都没有指定路径,在当前目录下首先寻找,
    如果当前目录下没有找到,那么,make 还会在下面的几个目录下找:  
1、如果 make 执行时,有“-I”或“--include-dir”参数,那么 make 就会在这个参数  
所指定的目录下去寻找。  
2、如果目录/include(一般是:/usr/local/bin 或/usr/include)存在的话,
make 也会去找。如果有文件没有找到的话,make 会生成一条警告信息,但不会马上出现致
命错误。继续载入其它的文件,一旦完成 makefile 的读取,make 会再重试这些没有找
到,或是不能读取的文件,如果还是不行,make 才会出现一条致命信息。如果你想让 make
不理那些无法读取的文件,而继续执行,在 include 前加一个减号“-”。
四、环境变量MAKEFILES
    最好不用
五、make的工作方式
1、读入所有的Makefile
2、读入被include的其它Makefile
3、初始化文件中的变量
4、推导隐晦规则,分析所有规则
5、为所有目标文件创建依赖关系
6、根据依赖关系,决定哪些目标要重新生成
7、执行生成命令
第五部分、书写规则
    依赖关系、生成目标的方法
    只有一个最终目标
一、规则举例
foo.o:foo.c defs.h
    cc -c -g foo.c
依赖关系
    生成的方法
二、规则的语法
target : prerequisites
    command
三、在规则中使用通配符
    * ? ...(后面详讲)
    让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合,
objects := $(wildcard *.o)  
    这种用法由关键字“wildcard”指出,关于 Makefile 的关键字,我们将在后面讨论。  
四、文件搜索
    特殊变量VPATH
VPATH = src:../headers
指定2个目录src和../headers
    关键字vpath,指定不同的文件在不同的搜索目录中
1、vpath
为符合模式的文件指定搜索目录
2、vpath  
清除符合模式的文件的搜索目录。  
3、vpath  
清除所有已被设置好了的文件搜索目录。  
    vapth 使用方法中的需要包含“%”字符。“%”的意思是匹配零或若干字符,
例如,“%.h”表示所有以“.h”结尾的文件。
指定了要搜索的文件集,
则指定搜索目录。例如:
vpath %h ../headers
五、伪目标
    不是一个文件,只是一个标签

你可能感兴趣的:(makefile)