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 := 1  
  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 。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章