Makefile 語法
Refs:
Makefile用法(call,origin,shell,foreach)
印值
rule1:
@echo "Hello Rule1"
$(info <text ...>)
內建變數
- AR = ar
- AS = as
- CC = cc
- CXX = g++
- RM = rm -f
- ARFLAGS = rv
- CFLAGS =
CXXFLAGS =
$@
Target的檔名$%
程式庫成員中的檔名元素$<
第一個prequeite的檔名$?
Timestamp 在Target之後的Prequeite$^ 所有的Prequeite的檔名 但不包含重複部分
- $+ 所有的Prequeite的檔名
- $* Target的主檔名
- $(@D) $(<D) 指的是Target的檔案路徑
- $(@F) $(<F)指的是Target的檔案名稱
OBJS = foo.o bar.o
CC = gcc
CFLAGS = -Wall -O -g
myprog : $(OBJS)
$(CC) $^ -o $@
foo.o : foo.c foo.h bar.h
$(CC) $(CFLAGS) -c $< -o $@
bar.o : bar.c bar.h
$(CC) $(CFLAGS) -c $< -o $@
給值 = 、 :=、 ?=、 +=
= 用到時才給值
var1=aaa
var2=$(var1)
var1=bbb
echo $(var2) #var2這時候展開才給var1的值
-------------
bbb
:=執行到時就給值
var1=aaa
var2:=$(var1) #var2已經變成aaa
var1=bbb
echo $(var2)
-------------
aaa
?= 變數沒定義才給值
+= 附加
foreach
$(foreach <var>,<list>,<text>)
把參數<list>中的單詞逐一取出放到參數<var>所指定的變量中,然後再執行<text>所包含的表達式。每一次<text>會返回一個字符串,循環過程中,<text>的所返回的每個字符串會以空格分隔,最後當整個循環結束時,<text>所返回的每個字符串所組成的整個字符串(以空格分隔)將會是foreach函數的返回值。
所以,<var>最好是一個變量名,<list>可以是一個表達式,而<text>中一般會使用<var>這個參數來依次枚舉<list>中的單詞。
dirs = $(shell ls)
clean:
@$(foreach dir,$(dirs),echo $(dir);)
names := a b c d
files := $(foreach n,$(names),$(n).o)
shell
它的參數應該就是操作系統Shell的命令。它和反引號「`」是相同的功能。這就是說,shell函數把執行操作系統命令後的輸出作為函數返回。注意,這個函數會新生成一個Shell程序來執行命令,所以你要注意其運行性能,如果你的Makefile中有一些比較複雜的規則,並大量使用了這個函數,那麼對於你的系統性能是有害的。特別是Makefile的隱晦的規則可能會讓你的shell函數執行的次數比你想像的多得多。
shell 函數的返回結果是命令 command 在 shell 中的執行結果。make 僅僅將 shell 函數的返回結果中的所有換行符替換成單空格
contents := $(shell cat foo)
files := $(shell echo *.c)
origin
$(origin <variable>)
origin函數不像其它的函數,他並不操作變量的值,他只是告訴你你的這個變量是哪裡來的,<variable>是變量的名字,不應該是引用。所以你最好不要在<variable>中使用「$」字符。
- undefined 如果<variable>從來沒有定義過,origin函數返回這個值「undefined」。
- default 如果<variable>是一個默認的定義,比如「CC」這個變量,這種變量我們將在後面講述。
- environment 如果<variable>是一個環境變量,並且當Makefile被執行時,「-e」參數沒有被打開。
- file 如果<variable>這個變量被定義在Makefile中。
- command line 如果<variable>這個變量是被命令行定義的。
- override 如果<variable>是被override指示符重新定義的。
- automatic 如果<variable>是一個命令運行中的自動化變量。關於自動化變量將在後面講述。
ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif