Makefile中常用的函数

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

一、Makefile中的函数格式

函数的调用和变量的调用很像。引用变量的格式为$(变量名),而函数调用的格式如下:

$(<function> <arguments>)    或者是     ${<function> <arguments>}
  • function 是函数名,arguments 是函数的参数。
  • 参数之间要用逗号分隔开。
  • 参数和函数名之间使用空格分开。
  • 调用函数的时候要使用字符“$”,后面可以跟小括号或者大括号。

建议用小括号,这样就可以记成:无论是调用函数还是引用变量,Makefile中都是用小括号,Shell中都是使用花括号。但Shell中将命令的结果赋给变量时也会使用小括号,比如 variable=$(command)。而Shell函数,见博客Shell函数_天糊土的博客-CSDN博客。

二、常用字符串处理函数

1、模式字符串替换函数:patsubst

函数使用格式如下:

$(patsubst <pattern>,<replacement>,<text>)

函数说明:查找 text 中的单词是否符合模式 pattern,如果匹配的话,则用 replacement 替换。返回值为替换后的新字符串。

实例:

OBJ=$(patsubst %.c,%.o,1.c 2.c 3.c)
all:
@echo $(OBJ)

执行 make 命令,我们可以得到的值是 "1.o 2.o 3.o",这些都是替换后的值。

2、字符串替换函数:subst

函数使用格式如下:

$(subst <from>,<to>,<text>)

函数说明:把字符串中的 form 替换成 to,返回值为替换后的新字符串。

实例:

OBJ=$(subst ee,EE,feet on the street)
all:
@echo $(OBJ)

执行 make 命令,我们得到的值是“fEEt on the strEEt”。

3、去空格函数:strip

函数使用格式如下:

$(strip <string>)

函数说明:去掉字符串的开头和结尾的字符串,并且将其中的多个连续的空格合并成为一个空格。返回值为去掉空格后的字符串。

实例:

OBJ=$(strip   a     b c)
all:
@echo $(OBJ)

执行完 make 之后,结果是“a b c”。这个只是除去开头和结尾的空格字符,并且将字符串中的空格合并成为一个空格。

4、查找字符串函数:findstring

函数使用格式如下:

$(findstring <find>,<in>)

函数说明:查找  in 中的 find ,如果查找的目标字符串存在,则返回目标字符串,否则返回空。

实例:

OBJ=$(findstring a,a b c)
all:
@echo $(OBJ)

执行 make 命令,得到的返回的结果就是 "a"。

5、过滤函数:filter

函数使用格式如下:

$(filter <pattern>,<text>)

函数说明:过滤出 text 中符合模式 pattern 的字符串,可以有多个 pattern 。返回值为过滤后的字符串。

实例:

OBJ=$(filter %.c %.o,1.c 2.o 3.s)
all:
@echo $(OBJ)

执行 make 命令,我们得到的值是“1.c 2.o”。

6、反过滤函数:filter-out

函数使用格式如下:

$(filter-out <pattern>,<text>)

函数说明:功能和 filter 函数正好相反,但是用法相同。去除符合模式  pattern 的字符串,保留符合的字符串。返回值是保留的字符串。

实例:

OBJ=$(filter-out 1.c 2.o ,1.o 2.c 3.s)
all:
@echo $(OBJ)

执行 make 命令,打印的结果是“3.s”。

7、排序函数:sort

函数使用格式如下:

$(sort <list>)

函数说明:将 <list>中的单词排序(升序)。返回值为排列后的字符串。

实例:

OBJ=$(sort foo bar foo lost)
all:
@echo $(OBJ)

执行 make 命令,我们得到的值是“bar foo lost”。注意:sort会去除重复的字符串。

8、取单词函数:word

函数使用格式如下:

$(word <n>,<text>)

函数说明:取出函数<text>中的第n个单词。返回值为我们取出的第 n 个单词。

实例:

OBJ=$(word 2,1.c 2.c 3.c)
all:
@echo $(OBJ)

执行 make 命令,得到的值是“2.c”。

三、常用文件名从操作函数

在编写 Makefile 的时候,很多情况下需要对文件名进行操作。例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等。当遇到这样的问题的时手动修改是不太可能的,因为文件可能会很多,而且 Makefile 中操作文件名可能不止一次。所以 Makefile 提供了相应的函数来实现文件名的操作。

注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待。

1、取目录函数:dir

函数使用格式如下:

$(dir <names>)

函数说明:函数的功能是从文件名序列 names 中取出目录部分,如果 names 中没有 "/" ,取出的值为 "./" 。返回值为目录部分,指的是最后一个反斜杠之前的部分。如果没有反斜杠将返回“./”。

实例:

OBJ=$(dir src/foo.c hacks)
all:
@echo $(OBJ)

执行 make 命令,得到的值是“src/ ./”。提取文件 foo.c 的路径是 "/src" 和文件 hacks 的路径 "./"。

2、 取文件函数:notdir

函数使用格式如下:

$(notdir <names>)

函数说明:函数的功能是从文件名序列 names 中取出非目录的部分。非目录的部分是最后一个反斜杠之后的部分。返回值为文件非目录的部分。

实例:

OBJ=$(notdir src/foo.c hacks)
all:
@echo $(OBJ)

执行 make 命令,我们可以得到的值是“foo.c hacks”。

3、取后缀名函数:suffix

函数使用格式如下:

$(suffix <names>)

函数说明:从文件名序列中 names 中取出各个文件的后缀名。返回值为文件名序列 names 中的后缀序列,如果文件没有后缀名,则返回空字符串。

实例:

OBJ=$(suffix src/foo.c hacks)
all:
@echo $(OBJ)

执行 make 命令,得到的值是“.c ”。文件 "hacks" 没有后缀名,所以返回的是空值。

4、取前缀函数:basename

函数使用格式如下:

$(basename <names>)

函数说明:从文件名序列 names 中取出各个文件名的前缀部分。返回值为被取出来的文件的前缀名,如果文件没有前缀名则返回空的字符串。

实例:

OBJ=$(notdir src/foo.c hacks)
all:
@echo $(OBJ)

执行 make 命令,得到值是“src/foo hacks”。获取的是文件的前缀名,包含文件路径的部分。

5、添加后缀名函数:addsuffix

函数使用格式如下:

$(addsuffix <suffix>,<names>)

函数说明:把后缀 suffix 加到 names 中的每个单词后面。返回值为添加上后缀的文件名序列。

实例:

OBJ=$(addsuffix .c,src/foo.c hacks)
all:
@echo $(OBJ)

执行 make 后得到“sec/foo.c.c hack.c”。如果文件本来就存在后缀名,依然会加上后缀。

6、添加前缀名函数:addperfix

函数使用格式如下:

$(addperfix <prefix>,<names>)

函数说明:把前缀 prefix 加到 names 中的每个单词的前面。返回值为添加上前缀的文件名序列。

实例:

OBJ=$(addprefix src/, foo.c hacks)
all:
@echo $(OBJ)

执行 make 命令后得到 "src/foo.c src/hacks" 。我们可以使用这个函数给文件添加路径。

7、链接函数:join

函数使用格式如下:

$(join <list1>,<list2>)

函数说明:把 list2 中的单词对应位置地拼接到 list1 的后面。返回值为拼接好的字符串。

实例:

OBJ=$(join src car,abc zxc qwe)
all:
@echo $(OBJ)

执行 make 命令后得到“srcabc carzxc qwe”。很显然,<list1>中的文件名比<list2>的少,所以多出来的保持不变。

8、获取匹配模式文件名函数:wildcard

函数使用格式如下:

$(wildcard PATTERN)

函数说明:列出当前目录下所有符合模式的 PATTERN 格式的文件名。返回值为当前目录下的所有符合模式 PATTERN 的文件名,它们以空格分隔。

实例:

OBJ=$(wildcard *.c *.h)
all:
@echo $(OBJ)

执行 make 命令,可以得到当前函数下所有的 ".c " 和  ".h"  结尾的文件。这个函数通常跟的通配符 "*" 连用,一般使用在依赖规则的描述中。

四、常用的控制函数

Makefile 中提供了两个控制 make 运行方式的函数。当 make 执行过程中检测到某些错误时,这些函数可以为用户提供消息,并且可以控制 make 执行过程是否继续。

1、error函数

函数使用格式:

$(error TEXT...)

函数说明:产生致命错误,并提示 "TEXT..." 信息给用户,并退出 make 的执行。error函数是在函数展开时(函数被调用时)才提示信息并结束 make 进程,因此如果函数出现在命令中或者一个递归的变量定义时,读取 Makefile 时不会出现错误。而只有包含 "error" 函数引用的命令被执行,或者定义中引用此函数的递归变量被展开时,才会提示知名信息 "TEXT..." 同时退出 make。其返回值为空。error函数一般不出现在直接展开式的变量定义中,否则在 make 读取 Makefile 时将会提示致命错误。

实例1:

ERROR1=1234
all:ifdef ERROR1$(error error is $(ERROR1))endif

make 读取解析 Makefile 时,如果ERROR1已经定义,make 将会提示致命错误信息 "error is 1234" 并保存退出。

实例2:

ERR=$(error found an error!)
.PHONY:err
err:;$(ERR)

在 make 读取 Makefile 时不会出现致命错误。只有"err" 作为目标被执行时才会出现。

2、wanning函数

函数格式如下:

$(warning TEXT...)

函数说明:函数 "warning" 类似于函数 "error" ,区别在于它不会导致致命错误(make不退出),而只是提示 "TEXT...",make 的执行过程继续。返回值为空。用法和 "error" 类似,展开过程相同。

五、其他常用函数

1、foreach函数

函数使用格式如下:

$(foreach <var>,<list>,<text>)

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

实例:

name:=a b c d
files:=$(foreach n,$(names),$(n).o)
all:
@echo $(files)

执行 make 命令,我们得到的值是“a.o b.o c.o d.o”。

注意,foreach 中的 <var> 参数是一个临时的局部变量,foreach 函数执行完后,参数<var>的变量将不再起作用,其作用域只在 foreach 函数当中。

2、if函数

函数使用格式如下:

$(if <condition>,<then-part>)或(if<condition>,<then-part>,<else-part>)

函数说明:if函数的参数可以是两个,也可以是三个。condition参数是 if 表达式,如果其返回的是非空的字符串,那么这个表达式就相当于返回真,于是then-part就会被计算,否则else-part会被计算。如果condition为真(非空字符串),那么then-part会是整个函数的返回值;如果condition为假(空字符串),那么else-part将会是这个函数的返回值,此时如果else-part没有被定义,则函数返回空字串符。then-partelse-part只会有一个被计算。

实例:

OBJ:=foo.c
OBJ:=$(if $(OBJ),$(OBJ),main.c)
all:
@echo $(OBJ)

执行 make 命令得到 foo.c,如果变量 OBJ 的值为空,执行 make 命令得到 main.c

3、call 函数

函数使用格式:

$(call <expression>,<parm1>,<parm2>,<parm3>,...)

函数说明:当 make 执行这个函数的时候,expression参数中的变量$(1)、$(2)、$(3)等,会被参数parm1parm2parm3依次取代,而expression的返回值就是 call 函数的返回值。我们可以写一个非常复杂的表达式,在这个表达式中,我们可以定义很多的参数,然后使用 call 函数来向这个表达式传递参数。

实例 1:

reverse = $(1) $(2)
foo = $(call reverse,a,b)
all:
@echo $(foo)

那么,foo 的值就是“a b”。当然,参数的次序可以是自定义的,不一定是顺序的,比如:

实例 2:

reverse = $(2) $(1)
foo = $(call reverse,a,b)
all:@echo $(foo)

此时的 foo 的值就是“b a”。

4、origin函数

函数使用格式:

$(origin <variable>)

函数说明:origin 函数通过返回值告知使用者这个变量是哪里来的。注意,variable 是变量的名字,不应该是引用,所以不要在 variable 中使用“$”字符。

下面是origin函数返回值:

  • “undefined”:如果<variable>从来没有定义过,函数将返回这个值。
  • “default”:如果<variable>是一个默认的定义,比如说“CC”这个变量。
  • “environment”:如果<variable>是一个环境变量并且当Makefile被执行的时候,“-e”参数没有被打开。
  • “file”:如果<variable>这个变量被定义在Makefile中,将会返回这个值。
  • “command line”:如果<variable>这个变量是被命令执行的,将会返回这个值。
  • “override”:如果<variable>是被override指示符重新定义的。
  • “automatic”:如果<variable>是一个命令运行中的自动化变量。

这些信息对于编写 Makefile 是非常有用的。假设有一个 Makefile文件,定义了一个变量bletch,而环境变量中也有一个环境变量bletch。我们判断这个变量是不是环境变量,如果是则将它重定义,如果不是则不重新定义。于是,我们在 Makefile 中,可以这样写:

ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf,gag,etc
endif
endif

当然,使用override关键字也可以重新定义环境中的变量,但是override会把从命令行定义的变量也覆盖了,而我们只想重新定义环境传来的,而不是重新定义命令行传来的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彻底解决zend studio 下 assignment in condition警告

最近在mac系统下安装zend studio作为php开发工具&#xff0c;把以前的代码导入&#xff0c;发现项目中有很多 “assignment in condition”的警告&#xff0c;造成原因是在条件判断的if、while中使用了如下类似的做法&#xff1a; if ($res $other)while (($row $res->fet…

添加分页

<div style"text-align: center; padding-top: 10px"><webdiyer:AspNetPager ID"AspNetPager1" runat"server" PageSize"20" FirstPageText"首页"CssClass"anpager" LastPageText"尾页" NextP…

Makefile中命令的编写

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 简述 Makefile的规则&#xff0c;是由依赖关系规则和命令组成的。 Makefile中所使用的命令是由 shell 命令行组成&#xff0c;它们是一条一条执行的。 Makefile 中的任何命令都要以ta…

走出浮躁的泥沼:浮躁的社会原因 控制好自己的物欲

http://www.nowamagic.net/librarys/veda/detail/2265现在这个社会&#xff0c;大家都很浮躁。简单说&#xff0c;因为他是消费者。 具体的逻辑推理是这样的&#xff1a; 1. 现在的社会是一个“富裕社会”&#xff08;Affluent Society&#xff09;&#xff0c;物质极大丰富&am…

c# 连接各种数据库 Access、Server等

1.C#连接连接Access程序代码:usingSystem.Data;usingSystem.Data.OleDb;..stringstrConnection"ProviderMicrosoft.Jet.OleDb.4.0;";strConnection"Data SourceC:BegASPNETNorthwind.mdb";OleDbConnection objConnectionnewOleDbConnection(strConnection)…

make命令的参数选项

在执行 make 命令时&#xff0c;有时根据需要&#xff0c;可以添加某些参数选项。比如只打印命令但不执行命令的参数选项是 "-n" &#xff0c;还有只执命令不打印命令的参数选项是 "-s"&#xff0c;包含其它文件的路径参数选项是 "-include"等等…

〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示

有没有遇到一种情况&#xff1a; 在工作区1打开了应用程序Google Chrome&#xff1b; 这个时间感觉它打开速度比较慢&#xff0c;就快捷键切换到工作区2了&#xff1b; 结果这个时候&#xff0c;Google Chrome就直接在工作区2打开&#xff0c;多不爽&#xff1f;&#xff01; &…

oracle 插入含字符串

1、创建表 SQL> create table t(id number,name varchar2(20)); 表已创建。 2、常规方式插入 SQL> insert into t values(1,’a&b’); 输入 b 的值: a&b 原值 1: insert into t values(1,’a&b’) 新值 1: insert into t values(1,’aa&b’) 已创建 1 行…

认识Makefile文件

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、Makefile文件是什么 Makefile 文件描述了 Linux 系统下 C/C 工程文件的编译规则&#xff0c;比如某些文件是否需要编译、文件编译的顺序、文件间的依赖关系、文件是否需要重建等等…

搭建Spring MVC 4开发环境八步走

Spring MVC作为SpringFrameWork的产品&#xff0c;自诞生之日&#xff0c;就受到广泛开发者的关注&#xff0c;如今Spring MVC在Java中的发展可谓是蒸蒸日上&#xff0c;如今如果再有开发者说&#xff0c;不了解Spring MVC&#xff0c;或许就被人笑掉大牙。煽情的话就不说了&am…

JQ获取CKeditor的值

var editor CKEDITOR.replace("content"); editor.setData(""); alert(CKEDITOR.instances.content.getData()); var editor CKEDITOR.replace("content"); alert(editor.getData()); 转载于:https://www.cnblogs.com/Alandre/p/3405363.htm…

Makefile中变量的定义、引用与赋值

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 Makefile文件中的变量有很多种类&#xff0c;其意义各不相同。比如普通变量、环境变量&#xff0c;自动变量&#xff0c;模式指定变量等。 这里主要讲普通变量的定义与使用。 一、变量…

address already in use: jvm_bind

这是用Myeclipse写网上书店时遇到的错误&#xff0c;错误的意思是8080端口被占用&#xff0c;解决问题的方式是找到占用8080端口的进程关闭就可以了&#xff0c; 在dos下输入netstat -ano 即可查看所有的 然后根据PID关闭进程&#xff0c;在任务管理器中&#xff0c;找到进转载…

case when then的用法

用法一&#xff1a;等值判断&#xff0c;相当于switch CASE expression   WHEN value1 THEN returnValue1   WHEN value2 THEN returnValue2   WHEN value3 THEN returnValue3   ELSE defaultValue END 例子&#xff1a;论坛中用户的等级 create table [user] (uId int…

Makefile中的自动化变量

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 自动化变量&#xff0c;可以理解为由 Makefile 自动产生的变量。 在模式规则中&#xff0c;规则的目标和依赖的文件名代表了一类的文件。在 Makefile 中描述规则时&#xff0c;依赖文件…

Makefile中的文件搜索路径(VPATH和vpath)

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 前言 当源文件与 Makefile 文件的存放路径不同时&#xff0c;如何将源文件的路径告知Makefile文件呢&#xff1f; 方法有两种&#xff1a;一般搜索VPATH&#xff0c;选择搜索vpath。 两…

今天是我开通博客的第一天

The first time I regist my blog.转载于:https://www.cnblogs.com/binquan/p/3417169.html

mysql导入sql文件过大或连接超时的解决办法

原文:mysql导入sql文件过大或连接超时的解决办法 前段时间出差在现场开发的时候&#xff0c;导入数据库老是出问题。最后发现了一个神奇sql语句交给实施&#xff0c;只要导入出错就把如下语句执行就可以了。至今屡试不爽。 set global max_allowed_packet100 000 000; set glob…

Makefile中的条件判断

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 日常使用 Makefile 编译文件时&#xff0c;可能会遇到需要分条件执行的情况。比如在一个工程文件中可编译的源文件很多&#xff0c;但是它们的类型是不相同的&#xff0c;所以编译文件…

SSH框架介绍

SSH 为 strutsspringhibernate的一个集成框架&#xff0c;是目前较流行的一种Web应用程序开源框架。 定义 集成SSH框架的系统从职责上分为四层&#xff1a;表示层、业务逻辑层、数据持久层和域模块层&#xff0c;以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的We…