文章目录
https://download.csdn.net/download/Shawn_Ch/12250282
0 makefile
Makefile是控制“ make”命令的文件。 Make在几乎每个平台上都可用,并用于控制项目的构建过程。 为项目编写Makefile之后,make可以轻松高效地构建项目并创建所需的输出文件。
0.1 规则
prerequisites中如果有一个以上的文件比target要新的话,command所定义的命令就会被执行。这个就是makefile中最核心的内容。
0.2 GCC&make自动推理
gcc [option] filename
可以直接输入文件来输出可执行文件,其中命令必须要用tab开头
当然也可以不输入.c文件,只要输入.o文件那么make就可以推理到.c文件。
0.3 makefile内容
显式规则
隐晦规则
变量定义:makefile中的变量有点像c语言中的宏,做了一个替换。
文件指示:引用别的makefile。格式为 include
注释
1 书写命令
1.1 显示命令
@echo
1.2 命令执行
如果需要两条指令连续执行,那么他们之间用分号隔开。
cd ./tools ;pwd
1.3 命令出错
执行过程中有可能出错,出错的话就会停止执行,所以需要在命令前加上“-”表示不管执行成功与否都继续执行。
2 变量
2.1 变量使用
变量的基础
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
makefile中“=”、“:=”、“+=”的区别。
https://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html
=
是把整个makefile都执行完之后的赋值
:=
覆盖之前的值
+=
两边的值相加,再赋值
?=
?= &esmp;//表示模块如果没有被定义的话,就定义。
JOB ?= $(job)//大小写通用。
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
override
如果定义了变量不想让Make命令行改变,可以在前面加override
OBJS = hello.c
override value1 = "this is a this is a test of override"
main:
@echo "start gcc"
gcc -o hello ${OBJS}
@echo ${value1}
.PHONE: clean
clean:
rm hello.o
执行
make value1=hello
此时value1的值不会改变。
多行变量
define two-lines
endif
这个功能可以定义一系列的函数变量等。
2.2 环境变量
Make 运行时的系统环境变量可以在 make 开始运行时被载入到 Makefile 文件中,但是如果 Makefile 中已定义了这个变量,或是这个变量由 make 命令行带入,那么系统的环境变量的值将被覆盖。(如果 make 指定了“-e”参数,那么,系统环境变量将覆盖 Makefile中定义的变量)。
很像“全局变量”和“局部变量”的特性。
MAKECMDGOALS:在命令行中指定Target,不指定则为空。
2.3模式变量
3 条件判断
3.1 ifeq
让make在运行时选择不同的分支。
value2 = "1"
value3 = "1"
ifeq "${value3}" "${value2}"
main: hello.o
@echo "start gcc"
gcc -o hello ${OBJS}
@echo ${value1}
endif
如果两值相等,那么才会执行。
3.2 ifdef
4 函数
4.1 字符串处理函数
subset
功能:进行字符串替代。
使用方法: $(subset from , to ,string)
patsubset
功能:进行模式字符串的替换,类似通配符的方法。
strip
去掉空格。strip为脱掉之意。
ifeq ($strip $(HELLO)),TRUE)
如果定义了HELLO = TRUE那么,以上函数由上一个makefile传递过来。
findstring
功能:查找字符串函数。$(find a ,a b c)//在abc中查找a。
filter
功能:过滤函数
filter-out
功能:反过滤函数,输出的是不符合要找的pattern的字符串。
sort
功能:给字符串中的单词,按照单词的升序进行排序。
3.2 文件名处理函数
3.3 foreach
功能:从名字就可以看出,这是一个循环函数,类似C中的for。
示例:names := a b c d
files := $(foreach n, $(names), $ (n).o)
//把names中的每一个放入n中。然后再执行后面的$(n).o
3.4 origin
功能:origin,起源。这个函数返回变量的起源信息。
3.5 if
功能:判断函数。
示例: $(if condition, do,else do).
4 Make的运行
待补充。
实例
make project=项目名称 new job=4 -j4
其中 除了前面加-的是make自己的命令,其他的都是变量, p=“项目名称"意思是给p这个变量赋值为"项目名称”,然后在mk中就可以进行按照工程名字进行执行了。