1. makefile 命令规则
target… : prerequisites …
command
…
…
-------------------------------------------------------------------------------
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
makefile中的shell命令的使用
- 明确用shell指明。
- 如果不需要打印执行的shell命令,可以用@shell_command 的形式,不输出打印命令。
2. 忽略命令出错
为了做到这一点,忽略命令的出错,我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的。如:
clean:
-rm -f *.o
3. 自动化变量
$@: 所有的target
$^: 所有的依赖
$<: 生成目标所需要的当前依赖
4. 变量赋值
4种赋值方式:
- 简单赋值( := )(最常用)
- 递归赋值( = ):使用最后一次有效值
- 条件赋值( ?= ):如果变量未定义,赋值有效,如果已经定义,赋值无效
- 追加赋值( += ):原变量后边追加新的值
5. 指定伪目标
“all” 这个伪目标是所有目标的目标,其功能一般是编译所有的目标。
“clean” 这个伪目标功能是删除所有被make创建的文件。
“install” 这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
“print” 这个伪目标的功能是例出改变过的源文件。
“tar” 这个伪目标功能是把源程序打包备份。也就是一个tar文件。
“dist” 这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。
“TAGS” 这个伪目标功能是更新所有的目标,以备完整地重编译使用。
“check”和“test” 这两个伪目标一般用来测试makefile的流程。
6. phony的作用
- 直接执行伪目标,不需要生成目标文件。
- 解决间接依赖不更新的问题。
7. 简单示例
编译一个hello.c 文件为hello可执行文件
CC=gcc
CFLAG=-c -Wall
SOURCE=hello.c
#OBJECT=$(SOURCE:.cpp=.o) #equal to -> line 14 && 15
OBJECT=hello.o
EXECUTABLE=hello
.PHONY:all
all: $(SOURCE) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECT)
$(CC) $(OBJECT) -o $(EXECUTABLE)
$(OBJECT): $(SOURCE)
$(CC) $(CFLAG) $(SOURCE)
clean:
rm -rf hello
echo "remove all exe file successfully!"