Makefile 基础
官方文档
https://www.gnu.org/software/make/manual/make.html
目标 - 依赖文件 - 命令
目标(文件):依赖文件 命令(命令前是一个TAB键)
1、make执行的格式为:make 目标,如果不指定目标,会执行Makefile中第一个出现的没有匹配符%的目标。
2、当依赖修改时,即有一个以上的依赖文件比 target 文件要新的话,需要重新生成目标,所以需要执行目标所对应的命令。当目标没有指定依赖,则make指定的目标所对应的命令一定会执行。
3、当目标没有指定依赖,比如all,被称为伪目标,因为不需要产生一个实际的名为 all 的目标文件,只要执行指令。伪目标有些时候需要配合.phony一起使用
make 命令带参数
一个工程,编写了 Makefile 后,通常只需要在当前目录下输入 make 命令即可完成编译。然而实际上, make 命令本身是可以接受参数的,完整的用法如下:
make [选项] [宏定义,比如 DEBUG=XX] [目标]
选项可以指定 make 的工作行为,宏定义可以指定执行 Makefile 的宏值,目标则是Makefile 中的目标,包含伪目标。这些参数都是可选的,各参数之间用空格分隔。
指定makefile文件
make程序如果没有使用 -f 选项指定一个Makefile,make则在当前目录下按顺序寻找下列文件:GNUMakefile、Makefile、makefile。推荐使用Makefile。
换行连接符
相关行如果过长,可以使用反斜线“\”作为后接行符来续行
注释
在描述语句行前面加“#”表示注释
命令前加破折号(-):make忽略命令行返回的状态
在命令前加“-”,表示如果这条指令执行失败,make将忽略这个错误,继续往下执行;如果不加“-”,则make会停止。等效于“make -i”命令
clean:
-rm *.o *~ core paper
命令前加@:不打印命令本身,只打印输出结果
install:
@echo You must be root to install
命令echo XXX中,XXX是结果,echo XXX是命令本身
条件指令
ifeq ($(CC),gcc) $(CC) -o foo $(objects) $(libs_for_gcc) else $(CC) -o foo $(objects) $(normal_libs) endif
include指令
include ${TOP_DIR}/config/common/makefile.mk
指定头文件路径
先定义一个变量存头文件路径,比如变量 INCLUDES
INCLUDES += \ -I${TOP_DIR}/ \ -I${TOP_DIR}/common/include/quectel/open \ -I${TOP_DIR}/interface/network/sockets/inc \ -I${TOP_DIR}/interface/dev/inc \
makefile 里调用 shell 输出
PWD:=$(shell pwd)
前置依赖 |
“| create_build”在此处的意义为前置依赖, create_build 为伪目标,合起来的意义是 create_build 这个伪目标要先被执行