makefile 自定义,预定义函数

简介: makefile 自定义,预定义函数

前言

makefile中 支持函数的概念。


一、自定义函数

1. 自定义函数介绍

makefile支持自定义函数实现,并调用执行。通过 define 关键字实现自定义函数。

  • 自定义函数是一个多行变量,无法直接调用。
  • 自定义函数是一种过程调用,没有任何的返回值。
  • 自定义函数用于定义命令集合,并应用于规则中。

2. 自定义函数的语法:

define  函数名
    # 函数内容
endef

示例: 可以定义单 多行命令。

对于 func2 ,函数体是 @echo “My name is $(0) .” @echo “Param => $(1)”。

$(0) 表示函数名称,在函数体中会被替换为 func2.

$(1) 表示第一个参数,在 下面函数调用时,可得参数。

3. 函数的调用:

test :
  $(call func1)
  $(call func2, 参数 1, 参数 2) 

可以在 Makefile 中通过 $(call …) 来调用函数。

在上面的代码中,call 的作用是调用自定义函数 func1,func2 并将其返回值赋给变量 var。

call

是 预定义函数,关于预定义函数下面会详细介绍。

语法 : $(call function-name,arg1,arg2,…)

其中,function-name 是函数的名称,arg1、arg2 等是函数的参数。

代码示例:
.PHONY : test       # 声明伪目标
define func1          # 创建 自定义函数
  @echo "My name is $(0)"
endef
define func2          
  @echo "My name is $(0)"     # $(0) 为函数名
  @echo "Parm 1 => $(1)"      # $(1) 为参数1
  @echo "Parm 2 => $(2)"      # $(2) 为参数2
endef
var := $(func1)           # 没有调用 call 函数,则不会将 $(0) 替换为func1
new := $(call fun1)         # $(call func1) 表示调用函数 func1,并将其返回值赋给变量 new
test :
  @echo " var => $(var)"
  @echo " new => $(new)"
  $(call func1)
  $(call func2,hello,world)   # func1 为函数名,hello 为参数1,world 为参数2

二、预定义函数

1. make 解释器中的预定义函数

make 及解析器提供一系列预定义函数供 makefile 调用。预定义函数在 Makefile 中内置,可以直接使用。

  • make 的函数提供了处理文件名,变量 和 命令 的函数。
  • 可以在需要的地方 调用函数来处理指定的参数
  • 函数在 调用的地方被替换为处理结果

2. 预定义函数的调用:

这里的 函数名 是 预定义函数名

示例:

.PHONY : test
var := $(abspath ./)      # 使用 abspath 函数获取当前目录的绝对路径
new := $(abspath test.cpp)    #  使用 abspath 获取当前目录下 test.cpp 文件的绝对路径
test :
  @echo " var => $(var)"
  @echo " new => $(new)"

abspath函数:

是 Makefile 中的一个预定义函数,用于获取路径的绝对路径。

语法 : $(abspath names…)

names 表示一个或多个文件名或目录名。abspath 函数会将每个参数转换为绝对路径

. / 表示当前目录。

3. 常见的预定义函数:

  • $(call func,arg1,…):调用函数函数,调用自定义或预定义函数并返回函数的值。
  • $(wildcard pattern):查找文件名函数,返回匹配 pattern 模式的所有文件名。
  • $(patsubst pattern,replacement,text):模式字符串替换函数,将 text 中所有匹配模式 pattern 的字符串替换为 replacement。
  • $(shell command):执行 shell 命令函数,执行 command 命令并返回其输出结果。
  • $(subst from,to,text):字符串替换函数,将 text 中所有的 from 替换为 to。
  • $(patsubst pattern,replacement,text):模式字符串替换函数,将 text 中所有匹配模式 pattern 的字符串替换为 replacement。

总结

下一节介绍 自动生成依赖关系

相关文章
|
算法 Java C++
27.【C/C++ 最全vector数组的用法 (详解)】(一)
27.【C/C++ 最全vector数组的用法 (详解)】
777 0
|
机器学习/深度学习 人工智能 自然语言处理
神经网络优化:提高AI模型性能的策略
神经网络优化是确保人工智能模型性能达到最佳的关键步骤。通过选择合适的激活函数、优化器和正则化技术,可以提高神经网络模型的准确度和泛化能力。随着深度学习领域的不断发展,神经网络优化策略也将不断进化,为人工智能技术带来更多的突破和创新。
1633 1
神经网络优化:提高AI模型性能的策略
|
数据采集 数据挖掘 Python
使用Python构建简单的Web爬虫:实现网页内容抓取与分析
本文将介绍如何使用Python编写一个简单的Web爬虫,实现对特定网页内容的抓取与分析。通过学习本文,读者将了解到如何利用Python的requests和Beautiful Soup库来获取网页内容,并通过示例演示如何解析HTML结构,提取所需信息。此外,我们还将讨论一些常见的爬虫挑战以及如何避免被网站封禁的策略。
|
6月前
|
算法 Go
Go 语言泛型 — 泛型语法与示例
本文详解 Go 语言泛型语法与使用示例,涵盖泛型函数、类型声明、类型约束及实战应用,适合入门学习与开发实践。
|
搜索推荐 算法 小程序
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
|
缓存 负载均衡 网络协议
Axure App 垂直滚动
Axure App 垂直滚动
1163 0
|
存储 传感器 人工智能
AliOS Things 系统架构介绍(一)
AliOS Things 系统架构介绍(一)
745 0
|
Go
一行代码处理字符串,Go语言链式调用技术深度指南
一行代码处理字符串,Go语言链式调用技术深度指南
573 0
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧