千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > makefiledefine详解

makefiledefine详解

来源:千锋教育
发布人:xqq
时间: 2023-11-24 21:24:57 1700832297

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的最大价值。

tags: mavengson
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT