makefile 函数全解

简介: makefile 函数全解

image.png

makefile 函数全解

makefile简介

  makefile 是一种类似shell的脚本文件,需要make工具进行解释 makefile 内的语句,然后执行内部语句。Makefile的作用是去管理工程项目,比如一个项目有很多c文件,需要利用Makefile去统一进行编译或者其他操作。[1]

函数全解介绍

以下脚本内容可有效作用于 make版本: GNU Make 4.2.1

相关链接

makefile变量全解

字符串处理函数

subst 函数—字符串替换

把字符串<text>中所有的<from>字符串替换成<to>

#$(subst <from>,<to>,<text>)
res = $(subst oo,OO,good food)
show:
    @echo $(res)   
#输出
gOOd fOOd

patsubst 函数 — 模式字符串替换

查找<text>中的单词末尾是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。

#$(patsubst <pattern>,<replacement>,<text>)
res = $(patsubst %ood,%OOd,good food)
show:
    @echo $(res)    
#输出
gOOd fOOd

strip 函数 — 去空格

去掉<string>字串中开头和结尾的空字符

#$(strip <string>)
res = $(strip good food  time    show  get set)
show:
    @echo $(res)
#输出
good food time show get set

findstring 函数 — 查找字符串

在字串<in>中查找<find>字串,如果找到就返回字符串,没找到就返回空

#$(findstring <find>,<in>)
res = $(findstring foo,good food)
show:
    @echo $(res)

#输出
foo

filter 函数 — 过滤器

<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式,用空格分隔。

#$(filter <pattern...>,<text>) 
res = $(filter %d %c %ab,good food bab come luc)
show:
    @echo $(res)
#输出
good food bab luc

filter-out 函数 — 过滤器

功能和上面相反,去除符合匹配pattern的。以<pattern>模式过滤<text>字符串中的单词,去除符合模式<pattern>的单词。可以有多个模式。

#$(filter-out <pattern...>,<text>)
res = $(filter-out %d %c %ab,good food bab come luc)
show:
    @echo $(res)
#输出
come

sort 函数 — 排序

给字符串<list>中的单词排序(升序)。

#$(sort <list>)
res = $(sort a c z d w y b e)
show:
    @echo $(res)
#输出
a b c d e w y z

word 函数 — 取单词

取字符串<text>中第<n>个单词。(从一开始)

#$(word <n>,<text>)
res = $(word 2,good food time)
show:
    @echo $(res)
#输出
food

wordlist函数 — 取一串字符串

从字符串<text>中取从<s>开始到<e>的单词串。<s><e>是一个数字。

#$(wordlist <s>,<e>,<text>)
res = $(wordlist 2,3,good food time)
show:
    @echo $(res)   
#输出
food time

words 函数 — 计算单词数

统计<text>中字符串中的单词个数

#$(words <text>) 
res = $(words good food time)
show:
    @echo $(res)    
#输出
3

firstword 函数 — 返回第一个单词

取字符串<text>中的第一个单词。

#$(firstword <text>)
res = $(firstword good food time)
show:
    @echo $(res)   
#输出
good

lastword 函数 — 返回最后一个单词

返回字符串<text>的第一个单词

#$(lastword <text>)
res = $(lastword good food time)
show:
    @echo $(res)   
#输出
time

文件名操作函数

dir 函数 — 取文件夹部分

从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。

#$(dir <names...>)
res = $(dir main.c subdir/subfile.c)
show:
    @echo $(res)   
#输出
./ subdir/

notdir 函数 — 取非文件夹部分

从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“ /”)之后的部分。

#$(notdir <names...>)
res = $(dir main.c subdir/subfile.c)
show:
    @echo $(res)   
#输出
main.c subfile.c

suffix 函数 — 取出各个文件名的后缀

从文件名序列<names>中取出各个文件名的后缀

#$(suffix <names...>) 
res = $(suffix main.c subdir/subfile.c)
show:
    @echo $(res)   
#输出
.c .c

basename 函数 — 取出各个文件名的前缀部

从文件名序列<names>中取出各个文件名的前缀部分。

#$(basename <names...>)
res = $(basename main.c subdir/subfile.c)
show:
    @echo $(res)   
#输出
main subdir/subfile

addsuffix 函数 — 添加后缀

把后缀<suffix>加到<names>中的每个单词后面

#$(addsuffix <suffix>,<names...>) 
res = $(addsuffix .c,main subdir/subfile)
show:
    @echo $(res)   
#输出
main.c subdir/subfile.c

addprefix 函数 — 添加前缀

把前缀<prefix>加到<names>中的每个单词前面。

#$(addprefix <prefix>,<names...>) 
res = $(addprefix  ./,main.c subdir/subfile.c)
show:
    @echo $(res)   
#输出
./main.c ./subdir/subfile.c

join 函数 — 各个单词进行连接

<list2> 中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比的多,那么,中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list2>中。

#$(join <list1>,<list2>)
res = $(join good food time,show look find read get put)
show:
    @echo $(res)  
#输出
goodshow foodlook timefind read get put

foreach 函数 — 依次处理字符串

把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是 foreach 函数的返回值。

所以,<var>最好是一个变量名,<list>可以是一个表达式,而<text>中一般会使用<var>这个参数来依次枚举<list>中的单词。<var>参数是一个临时的局部变量,foreach 函数执行完后,参数<var>的变量将不在作用。

#$(foreach <var>,<list>,<text>)
names := a b c d  
files := $(foreach n,$(names),$(n).o) 
show:
    @echo $(files)   
#输出
a.o b.o c.o d.o

if 函数 — 分支判断

类似于关键字 ifeq

#$(if <condition>,<then-part>) 或则 $(if <condition>,<then-part>,<else-part>)
num=4
res := $(if num<5,smaller,bigger)
show:
    @echo $(res) 

#输出
smaller

call 函数 — 调用其他变量

<expression>参数中的变量,如$(1)$(2)$(3)等,会被参数<parm1><parm2><parm3>依次取代。而<expression>的返回值就是 call 函数的返回值。

#$(call <expression>,<parm1>,<parm2>,<parm3>...)
first = Donald
last = Trump
Donald_Trump = "I'M BACK!"
func = $(1)_$(2)
fullname = $(call func,$(first),$(last))
res := $($(call func,$(first),$(last)))
show:
    @echo $(fullname)
    @echo $(res)      
#输出
Donald_Trump
I'M BACK!

origin 函数 — 变量来源

获取变量来源,<variable> 是变量名,不需要加 $

  • undefined :如果<variable>从来没有定义过,origin 函数返回这个值“undefined”

  • default : 如果<variable>是一个默认的定义,比如“CC”这个变量

  • file : 如果<variable>这个变量被定义在 Makefile 中

  • command line : 如果<variable>这个变量是被命令行定义的

  • override : 如果<variable>是被 override 指示符重新定义的

  • automatic : 如果<variable>是一个命令运行中的自动化变量

#$(origin <variable>)

shell 函数 — 执行shell命令

用于执行shell 命令

#$(shell <shell command>)
num = 10
res = $(shell echo $(num))
show:
    @echo $(res)   
# 输出
10

日志输出函数

用于控制日志输出,以及make执行

$(info 'here is info.')
$(warning 'here is warning.')
$(error 'here is error.')
#输出
'here is info.'
Makefile:3: 'here is warning.'
Makefile:4: *** 'here is error.'.  Stop.

总结

其他函数可参考帮助文档。

参考链接

makefile变量全解
gnu make 帮助手册
百度百科— make
image.png

目录
相关文章
|
6月前
|
SQL 人工智能 Dart
Android Studio的插件生态非常丰富
Android Studio的插件生态非常丰富
446 1
|
6月前
|
Ubuntu Linux Android开发
Android Studio支持多种操作系统
Android Studio支持多种操作系统
340 1
|
24天前
|
开发工具 Android开发 iOS开发
如何在Android Studio中配置Flutter环境?
如何在Android Studio中配置Flutter环境?
279 61
|
23天前
|
Java API 开发工具
Android cmdline-tools版本与最小JDK的关系
总的来说,Android的命令行工具和JDK之间的关系就像是一场舞会,两者需要彼此配合,才能共同创造出美妙的舞蹈。如果选择了不合适的舞伴(即不兼容的版本),可能会导致舞蹈中的步伐混乱,甚至无法完成舞蹈。而即使选择了合适的舞伴,也需要考虑舞伴的舞蹈技巧(即性能和稳定性),才能确保舞蹈的完美表现。因此,选择合适的Android命令行工具和JDK版本,是每一个Android开发者都需要面对的重要决定。
52 13
|
3月前
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
352 83
|
6月前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
2月前
|
安全 开发工具 Android开发
【Android Git】Git版本回退方式
在实际操作中,选择合适的版本回退方式,可以有效地管理代码版本,提高开发效率和代码质量。
148 26
|
3月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
126 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
3月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
248 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
87 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

推荐镜像

更多