1. 程式人生 > >Makefile中的變數和shell變數

Makefile中的變數和shell變數

我們在寫makefile時 多多少少會用到shell指令碼, 對於變數的在shell中的使用有一些要注意的細節。讓我們從一個簡單的makefile來看看。
注意makefile中一定要有一個目標,且一定要有一個終極目標,若想要有多個目標應該設立一個偽目標。如下:

all: hello hello2 hello3

hello: hello.c
    gcc ....
hello2: hello2.c
    gcc ...
hello3: hello3.c
    gcc ...
  • shell變數定義和使用:
NAME=hello #這裡一定不要有空格 hello可以加上""
'' 若定義的值有空格 則要加上""'' echo $NAME #這裡使用變數時 要加上$ 也可以${NAME} 但是不能$()這個表示執行裡面的命令
  • makefile中的變數定義:
HHH=hello  #方式一
ZZZ = hello #方式二
all:
    echo $HHH #這樣輸出並不能輸出HHH的值   A
    echo $ZZZ #同上
    echo $(HHH) # 輸出hello B
    echo $(ZZZ) # 輸出hello 這裡可以看到有別與shell變數定義。
    echo ${HHH} # 輸出hello  C
    echo
${ZZZ} # 輸出hello echo $$HHH # 輸出空 #$$這種方式是shell中使用makefile中定義的變數 這是一個command line。 D echo $$ZZZ # 輸出空 if [ -n "${HHH}" ];then echo "OK";fi; #這裡正確輸出OK E if [ -n "${ZZZ}" ];then echo "OK";fi; # 正確輸出OK if [ -n "$(HHH)" ];then echo "OK";fi; # 正確輸出OK H if [ -n "$(ZZZ)
"
];then echo "OK";fi; # 正確輸出OK if [ -n "$HHH" ];then echo "OK";fi; # 變數名不正確 J if [ -n "$ZZZ" ];then echo "OK";fi; # 變數名不正確 if [ -n "$$ZZZ" ];then echo "OK";fi; #沒有輸出 K if [ -n "$$HHH" ];then echo "OK";fi;#沒有輸出 if [ -n $$ZZZ ];then echo "OK";fi; #輸出OK L if [ -n $$HHH ];then echo "OK";fi;#輸出OK

我認為makefile的變數定義使用就像是c/c++中的巨集的使用方式 只是替換而已
1. 情況A中: echo $HHH 是優先於第一個字元結合去找$H變數 但是這裡沒有H定義 所以A這種情況 就是 echo HH 會輸出HH
2. 情況BC中:正確的使用方式
3. 情況D中:變數名變為$HHH 這樣的變數名為空
4. EH 中: 正確
5. J中$HHH 變為 HH
6. K 因為沒有定義$HHH這個變數
7. L 正確方式 與D的差別就是這句是shell D是command
以上是結合實際情況的個人理解

總結就是 makefile變數定義可以有空格, 使用變數時用$() 若在shell中使用makefile中定義的變數時,要使用$$ 並且一定不要使用“”和‘’。