首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Makefile不会在函数定义内的`ifeq`语句中赋值

Makefile是一种常用的构建工具,用于自动化编译和构建软件项目。在Makefile中,可以使用ifeq语句来进行条件判断和控制流程。

然而,在函数定义内部的ifeq语句中是无法直接进行赋值操作的。这是因为函数定义是在Makefile解析阶段进行的,而ifeq语句的条件判断是在运行时进行的。因此,在函数定义内部无法使用ifeq语句来赋值。

如果需要在函数定义内部进行条件判断和赋值操作,可以通过其他方式来实现。一种常见的方法是使用变量赋值表达式(:=)来定义一个临时变量,并在函数内部使用该变量进行条件判断和赋值操作。

以下是一个示例:

代码语言:txt
复制
define my_function
    # 定义临时变量
    tmp_var := $(shell if [ $(1) -eq 1 ]; then echo "yes"; else echo "no"; fi)
    
    # 根据条件进行赋值
    ifeq ($(tmp_var), yes)
        result := true
    else
        result := false
    endif
    
    # 输出结果
    @echo $(result)
endef

# 调用函数
$(call my_function,1) # 输出:true
$(call my_function,0) # 输出:false

在上述示例中,my_function是一个自定义的函数,接受一个参数$(1)。在函数内部,首先使用$(shell)函数执行一个shell命令,将结果赋值给临时变量tmp_var。然后,使用ifeq语句根据tmp_var的值进行条件判断,并将结果赋值给变量result。最后,通过echo语句输出result的值。

需要注意的是,在Makefile中,函数定义和函数调用之间不能有空行,否则会导致解析错误。

对于Makefile中的其他语法和概念,可以参考腾讯云的产品文档和官方指南,例如:

以上链接提供了详细的产品介绍、使用指南和开发文档,可以帮助您更深入地了解和应用腾讯云的相关产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Makefile学习2

ifdef 关键字 ifdef 关键字用来判断一个变量是否已经定义。如果变量值非空(在Makefile中,没有定义变量值为空),表达式为真。...定义一个变量没有赋值,或者没有定义变量,那么这个变量值都为空。...ifndef 关键字 ifndef关键字和ifdef相反,如果一个变量没有定义,表达式为真。 Makefile函数 GNU make 提供了大量函数用来处理文件名、变量、文本和命令。...给函数传递参数在函数中使用 (0)、 (1)引用。 用户自定义函数使用call函数间接调用,各个参数之间使用空格隔开。...) words函数:用来统计一个字符串TEXT中单词个数 $(words TEXT) foreach函数:做一些循环或遍历操作 $(foreach VAR,LIST,TEXT) 把LIST中使用空格分割单词依次取出并赋值给变量

32010
  • 芯片开发最常用Makefile语法和功能

    通过在变量赋值时结合使用 (nullstring) 和空格,可以确保空格被当作有效字符包含在变量值,而不被当作无意义行首空格处理掉。...这种赋值方式会立即展开并替换所有在定义时已知变量引用,不会保留任何待处理宏。一旦赋值完成,变量值就被固定下来,不再受后续变量定义影响。 ?= (条件赋值): 使用问号加等号(?...=)进行赋值时,只有在所定义变量尚未被赋值(即未定义或其值为空)情况下,才会为其赋予指定值。如果变量已有非空值,则此次赋值操作会被忽略。...单独 符号就是引用makefile定义变量值, $表示引用shell命令中定义变量值。..." endif ifndef bar echo "but bar is not" endif Makefile函数 Makefile中有许多自带函数供我们直接调用: subst函数 bar :

    14810

    Makefile 入门教程

    以下是一些高级用法详细介绍: 5.1 条件语句和函数 条件语句 Makefile 支持条件语句,可以根据条件来执行不同规则或命令。通常使用 ifeq 和 ifdef 这两个条件语句。...ifeq ($(VARIABLE), value) # 条件为真时规则和命令 else # 条件为假时规则和命令 endif 例如,可以根据是否定义了 DEBUG 变量来设置不同编译选项...: ifeq ($(DEBUG), 1) CFLAGS = -g else CFLAGS = -O2 endif 函数 Makefile 还提供了一些内置函数,用于处理文本和文件列表。...$(MAKE) 是一个 Makefile特殊变量,用于启动另一个 Makefile。 5.4 高级变量操作 Makefile 支持高级变量操作,包括字符串操作、条件赋值、变量展开等。...条件赋值 FOO ?= default_value 如果 FOO 变量未定义,则将其赋值为 default_value。

    40720

    Makefile 入门教程

    以下是一些高级用法详细介绍: 5.1 条件语句和函数 条件语句 Makefile 支持条件语句,可以根据条件来执行不同规则或命令。通常使用 ifeq 和 ifdef 这两个条件语句。...ifeq ($(VARIABLE), value) # 条件为真时规则和命令 else # 条件为假时规则和命令 endif 例如,可以根据是否定义了 DEBUG 变量来设置不同编译选项...: ifeq ($(DEBUG), 1) CFLAGS = -g else CFLAGS = -O2 endif 函数 Makefile 还提供了一些内置函数,用于处理文本和文件列表。...$(MAKE) 是一个 Makefile特殊变量,用于启动另一个 Makefile。 5.4 高级变量操作 Makefile 支持高级变量操作,包括字符串操作、条件赋值、变量展开等。...条件赋值 FOO ?= default_value 如果 FOO 变量未定义,则将其赋值为 default_value。

    24620

    Linux 开发 | 学习 Makefile

    但是如果下层目录已经定义了该变量,那么下层默认使用是它自己定义变量值,除非上层 makefile 在调用下层 makefile 时给参数 -e,则会强行覆盖。...= 如果没有被赋值过就赋予等号后面的值 += 添加等号后面的值 = 最基本赋值(最后才展开) make会将整个makefile展开后,再决定变量值。...自定义函数 当make执行这个函数时,variable参数中变量,如$(1),$(2),$(3)等,会被参 数 parm1, parm2,parm3 依次取代。...例子, 在 Makefile 中获取最后一个 git 提交 SHA 赋值给变量。...msg) @echo $(error msg) # error 中断执行 origin 函数 不操作变量, 返回变量定义地方 eval 函数 flavor 函数 guile 函数 ---- 下部分

    5.4K10

    【分享】在Petalinux编译多个源文件Linux内核模块,以及扩展Makefile功能

    KERNELRELEASE是Linux内核源码顶层Makefile定义一个变量。如果在内核源码目录编译,先执行Linux内核源码顶层Makefile,会定义KERNELRELEASE具体值。...如果加上对KERNELRELEASE检查,前面的Makefile可以改造成既可以在在内核源码目录编译,也可以在在内核源码目录外编译。...下面的Makefile,增加了检查KERNELRELEASE语句“ifeq ($(KERNELRELEASE),)”。...如果既不在PetaLinux环境里编译,也不再Linux内核源码目录编译,请再在上面的Makefile文件里定义内核源码目录。...Yocto recipe文件 Yocto recipe文件扩展名是.bb,它定义recipe需要文件。 原始bb文件 原始recipebb文件只含有一个C文件。

    6.3K10

    make menuconfig执行流程分析

    当在Linux内核(内核版本为3.18.42)顶层目录执行”make ARCH=arm menuconfig”时,命令行对内核根目录下Makefile文件ARCH这个变量赋值为arm ,并且指定了...这里: KBUILD_MODULES := KBUILD_BUILTIN := 1 KBUILD_BUILTIN和KBUILD_MODULES在顶层makefile文件中定义赋值后,就没有被改变过。...<<(Kconfig),展开为(obj)/mconf(obj)/mconf(Kconfig), obj值为scripts/kconfig,因为没有定义KBUILD_KCONFIG,而且SRCARCH之前已被赋值为...这里: KBUILD_MODULES := KBUILD_BUILTIN := 1 KBUILD_BUILTIN和KBUILD_MODULES在顶层makefile文件中定义赋值后,就没有被改变过。...<<(Kconfig),展开为(obj)/mconf(obj)/mconf(Kconfig), obj值为scripts/kconfig,因为没有定义KBUILD_KCONFIG,而且SRCARCH之前已被赋值

    3.6K10

    makefile变量赋值

    大家好,又见面了,我是全栈君 在定义变量值时,我们可以使用其它变量来构造变量值,在Makefile中有两种方式来在用变量定义变量值。...还有就是如果在变量中使用函数,那么,这种方式会让我们make运行时非常慢,更糟糕是,他会使用得两个make函数“wildcard”和“shell”发生不可预知错误。...因为你不会知道这两个函数会被调用多少次。http://hovertree.com/menu/linux/ 为了避免上面的这种方法,我们可以使用make中另一种用变量来定义变量方法。...上面都是一些比较简单变量使用了,让我们来看一个复杂例子,其中包括了make函数、条件表达式和一个系统变量“MAKELEVEL”使用: ifeq (0,${MAKELEVEL}) cur-dir...= bar 其含义是,如果FOO没有被定义过,那么变量FOO值就是“bar”,如果FOO先前被定义过,那么这条将什么也不做,其等价于: ifeq ($(origin FOO), undefined)

    1.3K20

    Makefile总结

    用=定义一个变量,并且赋值(等号两边可以加空格) 用+=追加字符串 例: A = src echo $(A) @echo $(A) ##只输出echo结果,不显示执行命令 可对上述Makefile...Makefile中有一些预定义函数,形式 $(函数名 参数列表) 参数列表:以逗号分隔 函数名和参数之间用空格分开 函数1:shell 获取当前目录路径: PWD = $(shell pwd) 函数2...这种情况可以使用伪目标来解决,可避免在makefile定义执行命令目标和当前目录下实际文件名冲突。 一旦定义为伪目标,make执行规则不会去查找隐含规则,同样也提高了效率。...$(MAKE) -C src DIR=/var/log 条件语句 Makefile中常见条件语句有: ifeq-else-endif ifneq-else-endif ifdef-else-endif...举个调试经常用到例子: DEBUG=true ifeq ($(DEBUG), true) CC=g++ -g else CC=g++ endif 通用模板 优化Makefile

    96310

    make menuconfig makefile kconfig详解

    kbuildMakefiles 内核各级目录源代码中大约有500个这样文件,编译时根据上层Makefile传下来定义和其他编译规则,将源代码编译成模块或编入内核。...当在Linux内核(内核版本为3.18.42)顶层目录执行”make ARCH=arm menuconfig”时,命令行对内核根目录下Makefile文件ARCH这个变量赋值为arm ,并且指定了...这里: KBUILD_MODULES := KBUILD_BUILTIN := 1 KBUILD_BUILTIN和KBUILD_MODULES在顶层makefile文件中定义赋值后,就没有被改变过。...由于scripts/kconfig目录下并没有Kbuild文件,因此函数 (wildcard (wildcard(kbuild-dir)/Kbuild)查找失败,返回为空,从而kbuild-file值被赋为...之前已被赋值为$(ARCH),即SRCARCH为arm,因此Kconfig值为arch/arm/Kconfig。

    1.8K10

    makefile基础和工作常用点补充

    f fileName  -n 显示待执行命令,但不执行 Makefile组成 显式规则:生成、依赖文件,生成命令 隐含规则:make支持自动推导功能, make –p 打印 变量定义:类C...=" 表示变量为空或未定义时才进行赋值操作。..."+=" 追加赋值,也是递归展开 执行shell命令赋值给变量 A = $(shell uname) 文件包含:include  注释:    “#” 特殊变量: 三、Makefile 工作常用点补充...vpath %.c  # 取消该模式 vpath  # 取消所有模式 VPATH 和 vpath 定义搜索路径仅对 makefile 规则有效,对 gcc/g++ 命令行无效,比如不能用它定义命令行头文件搜索路径参数...(无相同) 条件判断 conditional-directive text-if-true else text-if-false endif ifeq ($(CC

    1.4K00

    Linux makefile 教程 非常详细,且易懂

    = bar 其含义是,如果FOO没有被定义过,那么变量FOO值就是“bar”,如果FOO先前被定义过,那么这条将什么也不做,其等价于: ifeq ($(origin FOO), undefined)...如果变量之前没有定义过,那么,“+=”会自动变成“=”,如果前面有变量定义,那么“+=”会继承于前次操作赋值符。...:= $(variable) more 但如果是这种情况: variable = value variable += more 由于前次赋值符是“=”,所以“+=”也会以“=”来做为赋值,那么岂不会发生变量递补归定义...注意,error函数不会在一被使用就会产生错误信息,所以如果你把其定义在某个变量中,并在后续脚本中使用这个变量,那么也是可以。...后序 —— 终于到写结束时候了,以上基本上就是GNU makeMakefile所有细节了。

    4.3K20

    Makefile经典教程(掌握这些足够)

    = bar 其含义是,如果FOO没有被定义过,那么变量FOO值就是“bar”,如果FOO先前被定义过,那么这条将什么也不做,其等价于: ifeq ($(origin FOO),...如果变量之前没有定义过,那么,“+=”会自动变成“=”,如果前面有变量定义,那么“+=”会继承于前次操作赋值符。...五、override 指示符 如果有变量是通常make命令行参数设置,那么Makefile中对这个变量赋值会被忽略。...注意,error函数不会在一被使用就会产生错误信息,所以如果你把其定义在某个变量中,并在后续脚本中使用这个变量,那么也 是可以。...后序 —— 终于到写结束时候了,以上基本上就是GNU makeMakefile所有细节了。

    2.7K20

    【linux学习指南】Linux项目自动化构建工具 make makefile&&进度条代码

    Makefile命令符号 在 Makefile 中,有几个常用命令符号和特殊规则,它们用于定义和管理构建过程。以下是一些常用命令符号和其用途: 命令符号 @ 用法:@ 符号用于抑制命令回显。...示例: .PHONY: clean clean: rm -f *.o my_program 变量赋值 用法:Makefile 支持变量赋值,用于简化和重用配置。...变量可以在 Makefile定义并在规则中使用。...示例: ifeq ($(DEBUG), 1) CFLAGS += -g else CFLAGS += -O2 endif 模式规则 用法:模式规则允许你定义一类规则,从而简化多个类似文件编译过程...字符串已经被输出到终端上了,不会在缓冲区中等待。 这是因为 printf() 函数在 Linux 系统上默认是行缓冲,也就是说当遇到换行符 \n 时,才会将缓冲区中数据刷新到输出设备(终端)。

    10610

    CC++常见gcc编译链接错误解决方法

    17) 下面这个编译错误,可能是因为在全局域内调用一个类对象成员函数,全局域是不能直接执行函: error: expected constructor, destructor, or type...解决办法: 找到makefile文件第180行,将“else ifeq ($(BUILD_TYPE), debug)”,改成两行内嵌方式: # BUILD_TYPE specific settings...) # 不能和else同一行,否则Makefile语法错误,不支持else ifeq         CXXFLAGS     = $(cxxflags_debug)         libname...=/usr,是有区别的,前者赋值不能通过环境变量覆盖,后者则可以使用环境变量值覆盖。...: #define MYSQL_DB "mysql" 29) 下面这个错误是因为类成员函数声明和定义返回值不相同 test.cpp:201:6: 错误:‘bool foo(const

    7.8K30
    领券