makefile

makefile一、makefile 调试手段1、info 打印2、warning打印3、error打印4、info打印变量5、echo增加调试信息6、综合应用示例二、支持多种语言的 Makefile 通用模板,更简洁三、Makefile 判断平台1、第一种写法,比较丑,不方便使用2、第二种写法,条件语句漂亮许多,不用嵌套四、gtest Makefile 研究五、另一种风格的通用 Makefile六、一条语句编译项目七、vpath注意事项八、Makefile 中常用函数九、Makefile 导出变量给 sub-makefile十、自动变量十一、报错:"时钟错误的问题"十二、 'patsubst'讲解十三、Makefile级联十四、项目中使用独立模块十五、Makefile中创建多个文件夹,可能存在父子关系,调试未成功十六、 Makefile 自己编译依赖模块十七、Makefile 中排除不需要的C/CPP文件I、第一步II、第二步,去掉路径III、第三步,将b.cpp 从字符串中删除IV、第四步,删除多个cpp文件V、误删问题1、方案一:暴力解决2、方案二:精准删除十八、完整的,整合多项功能的 Makefile

一、makefile 调试手段

1、info 打印

2、warning打印

3、error打印

4、info打印变量

5、echo增加调试信息

6、综合应用示例

 

 

二、支持多种语言的 Makefile 通用模板,更简洁

三、Makefile 判断平台

1、第一种写法,比较丑,不方便使用

2、第二种写法,条件语句漂亮许多,不用嵌套

 

四、gtest Makefile 研究

五、另一种风格的通用 Makefile

六、一条语句编译项目

 

七、vpath注意事项

 

八、Makefile 中常用函数

$(subst FROM,TO,TEXT)

​ 函数名称:字符串替换函数

​ 函数功能:把字符串TEXT中的FROM字符串替换为TO

​ 返回值:替换后的新字符串

​ $(subst ee,EE,feet on the stree) //替换“feet on the street“中的ee为EE。结果得到字符串”fEEt on the strEEt”

$(patsubst PATTERN,REPLACEMENT,TEXT)

​ 函数名称:模式替换函数

​ 函数功能:搜索TEXT中以空格分开的单词,将符合模式PATTERN替换为REPLACEMENT。参数PATTERN中可以用模式通配符%来表示一个单词中的诺干字符。如果参数REPLACEMENT中也包含一个%,那么REPLACEMENT中的”%”将使PATTERN中的那个”%”所代表的字符串。而且只有第一个%作为模式字符来处理,之后出现的不再作为模式字符(作为一个字符)。转义字符可以避免%不作为为模式字符

​ 返回值:替换后的新字符串

​ 函数说明:参数TEXT单词之间的多个空格在处理时被合并为一个空格,并忽略前导和结尾空格

​ $(patsubst %.c,%.o,x.c.c bar.c)

​ 替换以.o结尾的字符,函数的返回结果就为”x.c.o bar.o”

$(strip STRING)

​ 函数名称:去空格函数

​ 函数功能:去掉字符串STRING开头和结尾的空格,并将其中多个连续空字符合并为一个空字符

​ 返回值:无前导和结尾空字符,使用单一空格分隔的多个单词的字符串

​ Strip函数常用语条件判断语句的表达式中,确保表达式比较可靠和健壮

$(findstring FIND,IN)

​ 函数名称:查找字符串函数

​ 函数功能:在字符串IN中查找FIND字符串

​ 返回值:如果在IN中找到FIND子字符串,则返回FIND,否则返回空

​ 函数说明:收索是严格的文本匹配

​ $(findstring a,a b c) 返回 a

​ $(findstring a,b c) 返回 空字符

$(filter PATTERN…,TEXT)

​ 函数名称:过滤函数

​ 函数功能:过滤掉字符串TEXT中所有不符合模式PATTERN的单词,保留所有符合此模式的单词。模式中一般需要包含字符%,存在多个模式时,模式之间用空格分隔

​ 返回值:空格分隔的TEXT字符串中所有符合模式PATTERN的字符串

​ 函数说明:filter可以用来去除一个变量中的某些字符串。

​ source := foo.c bar.c baz.s ugh.h

​ foo: $(source)

​ cc (source)) -o foo 此句话等于 cc foo.c bar.c baz.s -o foo 剔除掉了不符合.c,.s 的文件

$(filter-out PATTERN…,TEXT)

​ 函数名称:反过滤函数

​ 函数功能:和filter相反,剔除掉TEXT中所有符合模式PATTERN的单词

​ 返回值:空格分隔的所有不符合模式PATTERN的字符串

​ objects = main1.o foo.o main2.o bar.o

​ mains = main1.o main2.o

(mains),$(objects)) 去除了变量object中mains定义的字符串(文件名)的功能,返回”foo.o bar.o”

$(sort LIST)

​ 函数名称:排序

​ 函数功能:给字符串LIST中的单词以首字母为主进行排序,并去掉重复的单词

​ 返回值:空格分隔的没有重复单词的字符串

​ $(sort foo bar lose foo)

​ 返回值为”bar foo lose” 升序排,去掉重复单词

$(word N,TEXT)

​ 函数名称:取单词函数

​ 函数功能:取字符串TEXT中第N个单词(N的值从1开始)

​ 返回值:返回字符串TEXT中第N个单词

​ 函数说明:N大雨字符串TEXT中单词数目,返回空字符串。如果N为0,出错!!

​ $(word 2,foo bar baz) 返回bar

$(wordlist S,E,TEXT)

​ 函数名称:取字符串函数

​ 函数功能:从字符串TEXT中去除从S开始到E打单词串。S和E表示单词在字符串中位置的数字

​ 返回值:TEXT中从第S到E的单词串

​ 函数说明:“S”和“E”都是从1开始的数字。当“S”比“TEXT”中的字数大时,返回空。如果“E”大于“TEXT”字数,返回从“S”开始,到“TEXT”结束的单词串。如果“S”大于“E”,返回空。

​ $(wordlist 2,3,foo bar baz) 返回”bar baz”

$(words TEXT)

​ 统计TEXT字符串的单词个数,返回值即为单词个数

(word $(words TEXT),TEXT)

$(firstword NAMES…)

​ 函数名称:取首单词函数

​ 功能:取字符串“NAMES…“的第一个单词

​ 返回值:返回NAMES的第一个单词

​ $(firstword foo bar)

​ 返回值为foo。Firstword的实现功能等同于$(word 1,NAMES…)

​ 下面我们来看一个实际应用:Makefile中可以使用VPATH来指定搜索路径。对于源代码所包含的头文件的搜索路径需要使用gcc的-l参数指定目录来实现。VPATH罗列的目录是用:分隔的

​ ……

​ VPATH = src:../includes

​ override CFLAGS += (subst :, ,$(VPATH))) à CFLAGS += -lsrc -l../includes

​ 首先(VPATH))将VPATH中的:用空格代替。$(patsubst %,-l%,src ../includes) 在patsubst函数中,模式和替换模式中都有%时,两个%表示同样的值。而模式直接使用%表示无论啥都匹配,全匹配

九、Makefile 导出变量给 sub-makefile

A、用自己的话来复述一遍要点

1、上层 makefile 可以显式的将变量传给 sub-makefile

2、makefile export 各种选项的定义

3、要向下传递或者 export 一个变量,make 事先将变量添加到环境变量中。然后sub-make再使用环境变量来初始化它的变量

4、一般情况下,make 不会导出shell变量,需强制导出

5、默认情况下,特殊变量MAKEFLAGS是导出的,除非unexport it

命令行变量也自动导出。被追加在MAKEFLAGS后面

6、make 自动产生的变量一般不会导出,因为sub-makefile也会自己定义

B、正式开始

1、导出变量的语法

2、阻止导出

3、简写方法

4、如果要导出全部变量

5、特殊变量 MAKELEVEL会变,表示当前 makefile 的深度

6、Makefile 中的条件语句

一个例子

等同于

 

十、自动变量

十一、报错:"时钟错误的问题"

十二、 'patsubst'讲解

 

十三、Makefile级联

十四、项目中使用独立模块

 

十五、Makefile中创建多个文件夹,可能存在父子关系,调试未成功

十六、 Makefile 自己编译依赖模块

十七、Makefile 中排除不需要的C/CPP文件

I、第一步

II、第二步,去掉路径

III、第三步,将b.cpp 从字符串中删除

IV、第四步,删除多个cpp文件

V、误删问题

1、方案一:暴力解决

2、方案二:精准删除

十八、完整的,整合多项功能的 Makefile