makefile的if语法

$(if CONDITION,THEN-PART[,ELSE-PART]) 
 
¾  函数功能:第一个参数“CONDITION” ,在函数执行时忽略其前导和结尾空字
符,如果包含对其他变量或者函数的引用则进行展开。如果“CONDITION”的
展开结果非空,则条件为真,就将第二个参数“THEN_PATR”作为函数的计算
表达式;“CONDITION”的展开结果为空,将第三个参数“ELSE-PART”作为
函数的表达式,函数的返回结果为有效表达式的计算结果。 
¾  返回值:根据条件决定函数的返回值是第一个或者第二个参数表达式的计算结
果。当不存在第三个参数“ELSE-PART” ,并且“CONDITION”展开为空,函
数返回空。 
¾  函数说明:函数的条件表达式“CONDITION”决定了函数的返回值只能是
“THEN-PART”或者“ELSE-PART”两个之一的计算结果。 
¾  函数示例: 
 
SUBDIR += $(if $(SRC_DIR) $(SRC_DIR),/home/src) 
 
函数的结果是:如果“SRC_DIR”变量值不为空,则将变量“SRC_DIR”指定

的目录作为一个子目录;否则将目录“/home/src”作为一个子目录。 


==================Makefile start=======================

BUILD_DEST=/tmp/BUILD_DEST
TARGET_PREFIX=/tmp


.PHONY: prepare
prepare:
  $(if $(wildcard $(BUILD_DEST)),,mkdir -p $(BUILD_DEST))
  $(if $(wildcard $(BUILD_DEST)/src),,mkdir -p $(BUILD_DEST)/src)
  $(if $(wildcard $(TARGET_PREFIX)/bin),,mkdir -p $(TARGET_PREFIX)/bin)

================================Makefile  end=================================================

$(if $(wildcard $(BUILD_DEST)),,mkdir -p $(BUILD_DEST)) 

上面這行是說 如果BUILD_DEST等於"空"的話,就執行mkdir -p $(BUILD_DEST).反之若存在,則沒有任何動作




 

 
内核版本:2.6.35.13

在 Makefile 的 125 行中有一句:
  1. $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT)  
  2.     KBUILD_SRC=$(CURDIR)  
  3.     KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile  
  4.     $(filter-out _all sub-make,$(MAKECMDGOALS))  
其中  $(if $(KBUILD_VERBOSE:1=)),@) 的用法看起来有点蹊跷,实际上 $(VAR:x=y) 这种语法相当于 $(patsubst x,y,$(VAR)) 的缩写。这里需要注意一点,x 和 y 前面不能有  ‘%’ 匹配符,这是因为 '%' 已经被默认添加,所以它就如同如下形式:
$(patsubst %x,%y,$(VAR))

这样,$(if $(KBUILD_VERBOSE:1=)),@) 被展开为:
引用
  1. $(if $(patsubst %1,%,$(KBUILD_VERBOSE)),@)  
所以,只要 KBUILD_VERBOSE 为非 1 的任何字符时,整个表达式的结果就是 : @ 。如果 KBUILD_VERBOSE 为 1 时,那么整个表达式结果为空。实际上,表达式结果为 @ 时,就是希望后面的命令能够静默执行。

测试代码-1
  1. KBUILD_VERBOSE := hello1  
  2. all:  
  3.         @echo "$(if $(KBUILD_VERBOSE:1=),@)"  

运行输出:
引用
[beyes@beyes Makefile]$ make
@


测试代码-2
  1. KBUILD_VERBOSE :=  
  2. all:  
  3.         @echo "$(if $(KBUILD_VERBOSE:1=),@)"  

运行输出:
引用
$ make
                                                  #输出为空

此种用法还出现在

U-Boot 版本:1.1.6
在 U-Boot 的 Makefile 里有这么一个变量:

引用

  1. sbc2410x_config: unconfig  
  2.         @$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0  

在 $(@:_config=) 中,$@ 表示所有的 目标文件。也就是说,原先生成的目标文件的文件名末尾是 "_config" 字符串,而 '=' 号后为空,表示去掉 _config 这部分。上述的命令就变成了:
               @$(MKCONFIG)  sbc2410x arm arm920t sbc2410x NULL s3c24x0

比如有 Makefile 文件内容如下:
引用
hello _config: hello.o
                gcc -o $(@: _config=) $^
hello.o: hello.c
                gcc -Wall -c hello.c -o hello.o

make 后输出:
引用
t$ ls
hello    hello.c    hello.h    hello.o    Makefile

从这里可见,原本要输出的目标文件 hello_config 的可执行文件被改名为 hello 。


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Makefile的基础语法包括以下几个部分: 1. 编译规则:Makefile中的编译规则指定了目标文件的依赖关系和生成方式。通常的语法格式是: targets : prerequisites command 其中,targets是规则的目标,可以是标签、可执行文件或中间文件;prerequisites是依赖文件,即生成targets所需要的文件或目标;command是需要执行的命令,可以有多条,每一条占一行。 2. 变量定义:Makefile中可以定义变量来存储一些常用的值或路径。变量的定义格式是: variable_name = value 在后续的命令或规则中,可以通过$(variable_name)来引用该变量。 3. 通配符使用:Makefile支持使用通配符来匹配文件,常用的通配符有星号(*)和百分号(%)。星号表示匹配任意长度的任意字符,百分号则表示匹配任意长度的任意字符序列。 4. 目标文件搜索:Makefile中可以通过设置VPATH来指定目标文件的搜索路径。VPATH变量可以包含多个目录,Makefile会在这些目录中搜索依赖文件。 5. 伪目标:伪目标是一种特殊的目标,它并不对应真实的文件。在Makefile中定义伪目标可以用来执行一些特定的操作或命令。通常使用.PHONY来指定伪目标。 6. 条件判断:Makefile支持条件判断,可以根据不同的条件执行不同的命令或规则。常见的条件判断语句有if、ifdef、ifndef等。 7. 常用函数:Makefile提供了一些常用的函数,用于字符串处理或变量操作。例如,$(subst old,new,text)用于将文本中的old替换为new。 8. 命令执行:Makefile中的命令可以通过反斜杠(\)来换行,以便提高可读性。 这些是Makefile的基础语法,通过合理使用这些语法,可以编写一个灵活可靠的Makefile文件来管理工程的编译和链接过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值