全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

makefiledefine详解

发布时间:2023-11-24 21:24:57
发布人:xqq

makefiledefine是一种makefile的函数,通过它可以定义一个函数,使得后续的makefile中可以重复使用该函数。它能够减少代码冗余,提高代码复用率,减小代码的维护量,对于复杂的makefile而言,具有非常重要的作用。

一、makefiledefine的语法

makefiledefine的语法非常简单,它的基本格式如下:


define 函数名
    函数体
endef

其中,函数名是函数的名称,函数体是函数的实现,endef用于表示函数体的结束。需要注意的是,define和endef都必须从行首开始书写,否则makefile会将它们视为普通的命令而不是函数定义语句。

二、makefiledefine的用法

makefiledefine的用法非常广泛,它可以用于定义各种类型的函数,包括命令、变量、文件等。

1. 定义命令类型的函数

命令类型的函数一般用于封装一系列的命令,实现某一特定的功能。比如,我们需要对多个文件进行打包,可以使用以下define命令定义一个名为package的函数:


define package
    tar -zcvf $(1).tar.gz $(1)
endef

该函数将参数1作为文件名,使用tar命令将该文件夹打包成一个压缩包。

使用该函数只需要在makefile中调用即可:


$(call package, myfolder)

在make执行时,该函数会被展开成为相应的命令,执行打包操作。

2. 定义变量类型的函数

变量类型的函数一般用于封装某一特定的计算过程,返回一个值作为变量,以方便多处使用。比如,我们需要计算某个文件夹下的所有文件个数,并将其保存在一个变量中:


define file_count
    $$(shell find $(1) -type f | wc -l)
endef

OBJECTS_DIR = ./obj
SRCS = $$(wildcard *.c)
OBJS = $$(patsubst %.c,$(OBJECTS_DIR)/%.o,$$(SRCS))

count:
        $$(call file_count, $(SRCS))

该函数使用find命令查找某个文件夹下的所有文件,使用wc命令统计其个数,返回该个数作为函数的值。在make执行时,该函数会被展开成为相应的变量,使用调用该函数即可获取计算结果。

3. 定义文件类型的函数

文件类型的函数一般用于封装某一特定的文件操作,返回一个文件作为函数值,以方便后续的操作。比如,我们需要将若干个文件合并成一个文件,并返回合并后的文件名:


define merge_files
    $(shell cat $(1) > merged_file.txt && echo merged_file.txt)
endef

FILES = file1.txt file2.txt file3.txt
MERGED_FILE = $(call merge_files, $(FILES))

merge:
        @echo $(MERGED_FILE)

该函数使用cat命令将所有文件内容合并到merged_file.txt中,然后返回该文件名。调用该函数即可获取合并后的文件名。

三、makefiledefine使用的注意点

使用makefiledefine时需要注意以下几点:

1. 对define和endef需要进行转义处理

由于define和endef是makefile的关键字,所以在makefile中使用时需要进行转义处理。在makefile中,$和(都具有特殊含义,为了避免这些特殊含义对define和endef的解析造成困扰,需要在它们前面添加一个特殊符号,例如$$(和($$。

2. define和endef必须从行首开始书写

define和endef必须从行首开始书写,否则makefile会将它们视为普通的命令而不是函数定义语句。同时,函数体中的空格和制表符也非常重要,因为它们决定了函数体的缩进。

3. 函数名只能使用字母和数字

函数名只能由字母和数字组成,不能包含其他特殊符号。

4. 必须使用call关键字调用函数

定义函数之后,必须使用call关键字调用函数,才能让makefile将函数展开成相应的命令或变量。如果没有使用call关键字,makefile会将该函数视为普通的文本字符串而不是函数。

5. 用函数调用函数,要注意缩进问题

如果使用函数调用函数,需要注意缩进问题。如果调用的函数体中包含缩进,那么该缩进将会被传递到父函数中,可能会对makefile的执行造成影响。为了避免这个问题,可以使用$(strip)函数去除掉缩进。

四、总结

makefiledefine可以将常用的代码封装为函数,提高代码的复用性和可读性,尤其是对于需要重复执行的操作,用函数可以避免重复编写命令,节省工作量。在使用时需要注意转义字符、缩进、函数调用等问题,只有规范的使用才能发挥makefiledefine的最大价值。

mavengson

相关文章

深入Matplotlib中文教程

深入Matplotlib中文教程

2023-11-24
linux文档里面的内容合并,linux合并txt

linux文档里面的内容合并,linux合并txt

2023-11-24
Kafka查看Topic完全指南

Kafka查看Topic完全指南

2023-11-24
详解rabbitmq版本查看方法

详解rabbitmq版本查看方法

2023-11-24

最新文章

武汉新媒体行业公司排名

武汉新媒体行业公司排名

2023-11-01
武汉新媒体就业现状好吗

武汉新媒体就业现状好吗

2023-11-01
武汉全媒体行业发展现状及趋势

武汉全媒体行业发展现状及趋势

2023-10-31
武汉全媒体现状

武汉全媒体现状

2023-10-31
在线咨询 免费试学 教程领取