文档章节

makefile 常用函数

科陆李明
 科陆李明
发布于 2018/12/16 14:42
字数 1079
阅读 80
收藏 0

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。今天我们来学习下makefile的常用函数。

《GNU make》http://www.gnu.org/software/make/manual/make.html#Call-Function

1. 绝对路径 abspath 函数

abspath 函数被用于将 names列表 中的各路径名转换成绝对路径,并将转换后的结果返回。 其形式是:

$(abspath names…)

示例:

.PHONY: all

ROOT := $(abspath /usr/../lib /etc/init.d/../)

all: 
	@echo $(ROOT)

执行结果

$ make
/lib /etc

2. 增加前缀 addprefix 函数

addprefix 函数被用于给名字列表 names 中的每一个name增加前缀prefix, 并将增加了前缀的名字列表返回。 其形式是:

$(addprefix prefix,names…)

示例:

.PHONY: all

without_dir = foo.c bar.c main.o
with_dir := $(addprefix src/, $(without_dir))

all:
	@echo $(with_dir)

执行结果

$ make -f makefile-addprefix 
src/foo.c src/bar.c src/main.o

3. 增加后缀 addsuffix 函数

addsuffix 函数被用于给名字列表 names... 中的每一个名字增加后缀 suffix, 并将增加了后缀suffix的名字列表返回。 其形式是:

$(addsuffix suffix,names…)

示例:

.PHONY: all

without_suffix = foo bar main
with_suffix = $(addsuffix .c, $(without_suffix))

all:
	@echo $(with_suffix)

执行结果

$ make 
foo.c bar.c main.c

4. 创建定制化参数函数 call 函数

call 函数用来构造新的带参函数,其语法类似于C语言的 printf 函数。 其形式是:

$(call variable,param,param,…)

示例:

.PHONY: all

reverse = $(2)$(1)
foo = $(call reverse, a, b)

all:
	@echo $(foo)

执行结果

$ make
b a

5. 非展开取值 value 函数

函数 "value" 提供了一种在不对变量进行展开的情况下获取变量值的方法 其形式是:

$(value variable)

示例:

.PHONY: all

P = bar
foo = $PATH  # $P 会被展开为bar

all:
	@echo $(foo)
	@echo $(value foo)

执行结果

$ make 
barATH
/home/jerry/bin:/home/jerry/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/go/bin

6. eval 函数

eval 函数的存在使得 Makefile 具有动态语言的特性。eval 函数使得 make 将再一次解析 text 语句。eval 函数的返回值为空字符串。 其形式是:

$(eval text)

示例:

pointer := pointer_value

define foo
	arg := $1
	$$($1) := oooo
endef

before:
	$(info $(call foo,pointer))
	@echo arg = $(arg) pointer_value = $(pointer_value)

end: 
	$(eval $(call foo,pointer))
	@echo arg = $(arg) pointer_value = $(pointer_value)

执行结果

$ make before -f makefile-eval 
	arg := pointer
	$(pointer) := oooo
arg = pointer_value =
$ make end -f makefile-eval 
arg = pointer pointer_value = oooo
jerry@ubuntu:~/makefile/file/demo4$ 

由于在before中,函数foo并未执行,所以变量 arg 和 pointer_value 未被定义过,因此其值为空。

7. 过滤 filter 函数

filter 函数返回 text 中匹配任意一条 pattern 规则的单词 其形式是:

$(filter pattern…,text)

示例:

.PHONY: all

src = foo.c foo.h bar.c bar.h baz.s
src := $(filter %.c %.s, $(src))

all:
	@echo $(src)

执行结果

$ make
foo.c bar.c baz.s

8. 过滤后 filter-out 函数

filter-out 函数返回 text中被 pattern 过滤后剩下的单词 其形式是:

$(filter-out pattern…,text)

示例:

.PHONY: all

src = foo.c foo.h bar.c bar.h baz.s
src := $(filter-out %.c %.s, $(src))

all:
	@echo $(src)

执行结果

$ make
foo.h bar.h

9. 去路径 notdir 函数

notdir 函数被用来从路径 names... 中抽取文件名并返回。 其形式是:

$(notdir names...)

示例:

.PHONY: all

file_name := $(notdir code/foo/src/foo.c code/bar/src/bar.c baz.s)

all:
	@echo $(file_name)

执行结果

$ make
foo.c bar.c baz.s

10. 匹配替换 patsubst 函数

patsubst 函数被用来将名字 text 中符合 pattern 模式的名字替换为 replacement,并将替换后的名字列表返回。 其形式是:

$(patsubst pattern,replacement,text)

示例:

.PHONY: all

src = foo.c bar.c baz.c
obj = $(patsubst %.c, %.o, $(src))

all:
	@echo $(obj)

执行结果

$ make
foo.o bar.o baz.o

11. 真实路径 realpath 函数

realpath函数被用于获取 names... 所对应的真实路径名。 其形式是:

$(realpath names…)

示例:

.PHONY: all

ROOT := $(realpath ./.. ./../..)

all:
	@echo $(ROOT)

执行结果

make
/home/jerry/makefile/file /home/jerry/makefile

12. 去空格 strip 函数

strip 去掉string中的多余空格并返回 其形式是:

$(strip string)

示例:

.PHONY: all

string = 12 3   4    5
str_strip = $(strip $(string))

all:
	@echo $(str_strip)

执行结果

$ make
12 3 4 5

13. 通配符函数 wildcard 函数

其形式是:

$(wildcard pattern)

示例:

.PHONY: all
SRC = $(wildcard *.c)

all:
    @echo $(SRC)

执行结果

$ ls
foo.c foo.h bar.c bar.h
$ make
foo.c bar.c

© 著作权归作者所有

共有 人打赏支持
科陆李明
粉丝 3
博文 29
码字总数 13943
作品 0
深圳
程序员
私信 提问
Linux工具入门:make工具与Makefile文件

Linux工具入门:make工具与Makefile文件 main.o:main.c add.o:add.c add.h sub.o:sub.c sub.h gcc -Wall -g -c main.c -o main.ogcc -Wall -g -c add.c -o add.ogcc -Wall -g -c sub.c -o s......

zjy900507
2018/05/09
0
0
Makefile实例

不要为Makefil 困惑. 不会就去问了, 最好有人问, 没人找人, 我就是这样, 找了好多的群, 都是一个个加, 不懂就发言, 总有一个人回的, 多交这方面的朋友, 这样学得更快. QQ: 106412529 希望交更...

长平狐
2012/09/03
196
0
跟我一起写 Makefile (重制版)

申明 因为发现网上陈皓的<<跟我一起写 Makefile>>是Makefile相关很全面的中文资料,但流传的该文档中出现了部分笔误且没有目录。 因此本文主要目地是在对该文档重制,排版并在部分位置做了少量...

面码
2014/04/17
0
0
cygwin + gcc+makeFile入门(一): Mafile的基本指令

别指望这篇文章帮你搭建Cygwin的环境。 因为说这个的太多。这篇文章的环境是Cygwin的开发环境。 这篇文章将指引如何写MakeFile, 以及Gcc编译的几个常用开关: MakeFile的思想:提供一个细分...

晨曦之光
2012/03/09
335
0
cygwin + gcc+makeFile入门(一): Mafile的基本指令

别指望这篇文章帮你搭建Cygwin的环境。 因为说这个的太多。这篇文章的环境是Cygwin的开发环境。 这篇文章将指引如何写MakeFile, 以及Gcc编译的几个常用开关: MakeFile的思想:提供一个细分...

晨曦之光
2012/03/09
550
0

没有更多内容

加载失败,请刷新页面

加载更多

如何限制用户仅通过HTTPS方式访问OSS?

一、当前存在的问题 当前OSS支持用户使用HTTPS/HTTP协议访问Bucket。但由于HTTP存在安全漏洞。大型企业客户都要求使用HTTPS方式访问OSS,并且拒绝HTTP访问请求。 目前OSS可以通过RAM policy方...

阿里云官方博客
16分钟前
0
0
详解深度学习之经典网络架构——LeNet

一、基本简介 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 二、LeNet网络的基本结构 LeNet5 这个网络虽...

AI女神
19分钟前
0
0
日志服务Python消费组实战(二):实时分发数据

场景目标 使用日志服务的Web-tracking、logtail(文件极简)、syslog等收集上来的日志经常存在各种各样的格式,我们需要针对特定的日志(例如topic)进行一定的分发到特定的logstore中处理和...

阿里云云栖社区
20分钟前
1
0
LVM 增加磁盘扩容

sudo parted /dev/sdeparted> mklabel gptparted> mkpart primary lvm ext4 %0 %100parted> printsudo lvmlvm> pvcreate /dev/sde1lvm> vgextend vg-data /dev/sde1lvm> lve......

仪山湖
23分钟前
0
0
Linux挂载本地iso镜像,不联网使用yum命令

上传iso镜像文件到/mnt 目录下 在/mnt目录下创建Server目录 mkdir Server 备份 /etc/yum.repos.d/目录下的repo文件 cd /etc/yum.repos.dmkdir repobakmv *.repo repobak/ 挂载本地iso文件...

AustinYe
25分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部