首页 > 其他分享 >轻松玩转makefile | 函数的使用

轻松玩转makefile | 函数的使用

时间:2023-03-03 15:58:13浏览次数:32  
标签:%. 函数 makefile PHONY echo 玩转 fun main

前言

在上一篇文章中,尽管使用了变量和模式,但还是有不够好的地方,在Makefile中要指明每一个源文件,我们接下来利用函数对其进行优化,并介绍其他常用的一些函数。

依旧是以fun.c ,main.c 和Makefile三个文件为例,文件内容就不再贴出来了,前两篇文章中都有。

1.wildcard函数

wildcard是通配符函数,通过它可以得到当前工作目录中满足 _pattern模式的文件或目录名列表。

格式为:$(wildcard _pattern)

.PHONY:all	

SRC = $(wildcard *.c)

all:
	@echo $(SRC)

运行make

fun.c main.c

2.patsubst函数

patsubst 函数被用来将名字列表 _text中符合 _pattern模式的名字替换为 _replacement,并将替换后的名字列表返回。

格式为:$(patsubst _pattern, _replacement , _text)

.PHONY:all

SRC = fun.c main.c
objects := $(patsubst %.c, %.o, $(SRC))
all:
	@echo $(objects)

运行make

fun.o main.o

有了这个两个函数,我们可以对之前的makefile进行优化

优化前

.PHONY:clean

CC = gcc
RM = rm

TARGET = app
OBJS = main.o fun.o

$(TARGET) : $(OBJS)
	$(CC) -o $@ $^
%.o : %.c
	$(CC) -o $@ -c $^
clean:
	$(RM) $(TARGET) $(OBJS)

优化后

.PHONY:clean

CC = gcc
RM = rm

TARGET = app
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))

$(TARGET) : $(OBJS)
	$(CC) -o $@ $^
%.o : %.c
	$(CC) -o $@ -c $^
clean:
	$(RM) $(TARGET) $(OBJS)

3.abspath函数

abspath函数被用于将 _names中的各路径名转换成绝对路径,并将转换后的结果返回。

格式为:$(abspath _names)

.PHONY:all

ROOT := $(abspath /usr/../lib)

all:
	@echo $(ROOT)

运行make

/lib

4.addprefix函数

addprefix函数被用于给名字列表 _names中的每一个名字增加前缀 _prefix,并将增加了前缀的名字列表返回。

格式为:$(addprefix _prefix, _names)

.PHONY:all

without_dir := fun.c main.c
with_dir := $(addprefix objs/, $(without_dir))

all:
	@echo $(with_dir)

运行make

objs/fun.c objs/main.c

5.addsuffix函数

addsuffix函数被用于给名字列表 _names中的每一个名字增加后缀 _suffix,并将增加了后缀 _suffix的名字列表返回。

格式为:$(addsuffix _suffix, _names)

.PHONY:all

without_suffix := funA funB
with_suffix := $(addsuffix .c, $(without_suffix))

all:
	@echo $(with_suffix)

运行make

funA.c funB.c

6.filter函数

filter函数被用于从一个名字列表 _text中根据模式 _pattern得到满足需要的名字列表并返回。

格式为:$(filter _pattern, _text)

.PHONY:all

sources = fun.c main.c other.o test.h
sources := $(filter %.c %.o, $(sources))

all:
	@echo $(sources)
# touch other.o test.h
# ls
fun.c  main.c  Makefile  other.o  test.h

运行make,可以看到,调用filter函数后,sources变量中只会有.c和.o的文件, .h文件不符合要求被过滤了

fun.c main.c other.o

7.filter-out函数

filter-out函数被用于从名字列表 _text中根据模式 _pattern滤除一部分名字,并将滤除后的列表返回。

格式为:$(filter-out _pattern, _text)

.PHONY:all

objects = funA.o funB.o fun.c main.c other.o test.h 
results = $(filter-out fun%.o, $(objects))

all:
	@echo $(results)

利用touch命令新建funA.o,funB.o文件,运行make

fun.c main.c other.o test.h

8.notdir函数

notdir函数被用来从路径 _names中抽取文件名,并将文件名返回。

格式为:$(notdir _names)

.PHONY:all

file_name := $(notdir code/src/fun.c code/src/main.c)
all:
	@echo $(file_name)

运行make

fun.c main.c

9.realpath函数

realpath函数被用于获取names所对应的真实路径名。

格式为:$(realpath _names)

.PHONY:all

ROOT := $(realpath ./..)

all:
	@echo $(ROOT)

运行make

/mnt/hgfs/Work/Makefile/3.2

10.strip函数
strip函数可以将将 _string 中的多余空格去除后返回。

格式为:$(strip _string)

.PHONY:all

orginal := fun.c       main.c
stripped := $(strip $(orginal))


all:
	@echo "original =  $(orginal)"
	@echo "stripped =  $(stripped)"

运行make

original =  fun.c       main.c
stripped =  fun.c main.c

小结

本文介绍了一些常用的函数,只要加以灵活运用,会让你的Makefile变得高效又智能。
————————————————————————————————

码字不易,点个赞再走吧!

欢迎关注我的同名公众号,这里有更多好料等着你哦!

标签:%.,函数,makefile,PHONY,echo,玩转,fun,main
From: https://www.cnblogs.com/Wayne123/p/17175856.html

相关文章

  • 如何写出漂亮的构造函数 option funciton
    1. Golang里面没有构造函数,但是Golang却可以像C++一样实现类似继承、构造函数一样等面向对象编程的思想和方法Golang里面要实现相关的构造函数定义可以通过通过new来创建......
  • SQLite的ROUND函数的坑和解决方案
    今天使用sqlite的round函数对数据进行四舍五入处理,但遇到了以下问题,如图所示: 为什么结果不一样,不得而知,但我找到了解决方案,同大家分享一下。首先在c#中创建自定义函数[......
  • 《SQL基础》14. 存储过程 · 存储函数
    目录存储过程基本语法变量系统变量用户定义变量局部变量if判断参数case判断while循环repeat循环loop循环游标条件处理程序存储函数存储过程存储过程是事先经过编译并存......
  • 箭头函数
    箭头函数箭头函数是传统函数表达式的简写方式,它简化了函数的编写,也带来了一些限制导致在一些场景下它无法使用。特点:箭头函数没有自己的this,无法通过call、apply、bind......
  • 个人觉得好用的工具函数(如把数字转成千分位逗号分隔)
    //js数字每三位加逗号(千分位格式)美元格式3位一个逗号  handleUs(val){   //eg:2536995--->2,536,995爽得一匹   returnval.toLocaleString()......
  • 6.封装axios定义ajax请求函数模块与优化统一处理异常
    安装axios包:【版本:1.3.3】npminstallaxios初级版本api/ajax.js文件内容/*能发送异步ajax请求的函数模块封装axios库函数的返回值是promise对象:.......
  • Oracle时间相关函数
    Oracle时间相关函数1、获取当前时间selectsysdatefromdual;2、日期格式以2023-03-0217:09:23为例格式类型名称示例年(Year)yytwodigits两位年显......
  • 180205 Keras回调函数Callback举例
    调用LambdaCallback调用History自定义Callback类+调用tensorboard的程序结果runfile('F:/180204/NoisyLabelCode/noisy_labels27Code/mnist-mlp.py',wdir='F:/180204/Noi......
  • PHP 常见字符串函数
    1、字符串格式化1、trim():删除字符串两端的空格或其他预定义字符2、rtrim():删除字符串右边的空格或其他预定义字符3、ltrim():删除字符串左边的空格或其他预定义......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
        建模思想的渗透要注意一直持续下去,不能够出现口头学习问题,否则无法从根本上有效锻炼及发展高中生的数学建模能力。而在帮助学生巩固数学建模思想运用过程中可以......