Makefile基础教程(函数的使用)
  micz61TEX78l 2023年11月02日 17 0

(文章目录)


前言

在Makefile中也是存在函数的,在 Makefile 中,可以使用函数调用来处理变量、字符串和路径等操作。那么下面就来看看是如何在makefile中使用函数的吧。

一、自定义函数

1.使用示例

在 Makefile 中,可以使用自定义函数来完成一些特定的操作。自定义函数一般使用 define 和 endef 命令来实现,在 define 和 endef 之间是函数体。自定义函数在使用 call 函数进行调用,在调用时传递参数。自定义函数可以使用 Makefile 内置的命令和变量,也可以使用自定义变量和命令。

下面是一个自定义函数的例子:

define myfunc
	$(if $(filter $(1), yes), \
		@echo "My function param is Yes", \
		@echo "My function param is Not Yes" \
	)
endef

test:
	$(call myfunc,yes)         # 调用 myfunc 函数,输出 "My function param is Yes"
	$(call myfunc,no)          # 调用 myfunc 函数,输出 "My function param is Not Yes"

在这个例子中,使用 define 定义了一个名为 myfunc 的自定义函数,该函数接收一个参数。函数体使用了 if 和 filter 命令,判断传入的参数是否为 “yes”。调用 myfunc 函数时,使用 call 函数进行调用,并传递一个参数。

执行结果: 在这里插入图片描述

2.注意事项

1.自定义函数是一个多行变量,无法直接调用,需要使用call函数调用。

2.自定义函数用于定义命令集合,并应用于规则中。

二、预定义函数

1.call函数

在 Makefile 中,call 函数用于调用一个自定义函数,并返回其结果。其语法为:

$(call function-name,param1,param2,...)

其中,function-name 为自定义函数的名称,param1、param2等为传递给函数的参数值,多个参数用逗号分隔。

call 函数的返回值为自定义函数的输出结果,可以使用变量来接收它。例如:

define my-func
    # some operations
    @echo "hello world"
endef

result := $(call my-func)

在上述例子中,我们定义了一个名为 my-func 的自定义函数,其中输出了一行 “hello world”。然后,使用 call 函数来调用这个函数,并将结果赋值给 result 变量。

需要注意的是,在自定义函数中使用 $(result) 就可以使函数的结果返回给调用者。而在调用 call 函数时,需要将其结果存储到一个变量中以便之后的使用。

2.abspath函数

abspath 函数用于将路径转换为绝对路径。其语法为:

$(abspath names...)

其中,names 可以是一个或多个路径名,路径名之间用空格分隔。

abspath 函数将路径名解释为相对于当前工作目录的相对路径,并将其转换为绝对路径。如果路径名已经是绝对路径,那么 abspath 函数将原样返回该路径名。使用 abspath 函数可以避免在 Makefile 中出现因相对路径引发的错误。

代码例子:

define func1
	@echo "I am $(0)"	
endef

var := $(call func1)
var1 := $(func1)
var2 := $(abspath ./)
var3 := $(abspath test.cpp)

test:
	$(call func1)
	@echo "var = $(var)"
	@echo "var1 = $(var1)"
	@echo "var2 = $(var2)"
	@echo "var3 = $(var3)"

运行结果: 在这里插入图片描述

总结

这里有一些需要注意的地方我给大家例举出来:

自定义函数的名称需与定义时一致。

在自定义函数中返回值需要使用 $(var) 形式进行返回,例如:$(call my-func)。

自定义函数传递参数时并不需要显式声明参数类型,如何使用这些参数完全由函数实现者定义。

因此,在使用自定义函数时需要先进行定义,随后才能调用。而预定义函数则可以直接调用。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  rYbDpQnHh4bw   2023年11月02日   64   0   0 缓存官网bash
  oJyKzGPzrrQi   2023年11月02日   112   0   0 IUS源gitlinux运维bash
  3OWcH55z3bwR   2023年11月02日   75   0   0 javabashjar
  a2cU6wh5pQPw   2023年11月13日   27   0   0 shellphpbash
micz61TEX78l