Make腳本的基礎
Makefile中的變量,就像是C/C++語言中的宏一樣,代表文本字符串,在Makefile中執行的時候會自動原樣地展開在所使用的地方。
其與C/C++的宏所不同的是可以在Makefile中改變其值。在Makefile中,變量可以使用在目標、依賴目標、命令或是Makefile的其它部分中。
變量的命名可以包含字符、數字、下劃線(可以是數字開頭),但不應該含有“:”、“#”、“=”或是空白字符(空格、回車等)。
變量名對大小寫敏感,傳統的變量名是全大寫的命名方式。
變量的定義格式
變量名 賦值符號 變量的值
賦值符號有三種:
= 直接將後面的字符串賦給變量
:= 後面跟變量,將它的內容賦給變量
+= 變量原來的值+空格+後面的字符串=>新的變量值
例如
CC = arm-linux-gcc
Echo $(CC)
常用的爲 = +=
變量的引用
變量引用的三種格式:
$(變量名)
${變量名}
當變量名爲單個字符時,可以省略括號
make處理變量時會掃描一遍整個Makefile,確定所有變量的值,因此變量的使用可以在定義之後,而且使用的是最後一次賦予的值。
例:
objects = program.o foo.o utils.o
program : $(objects)
gcc -o program $(objects)
變量的定義可以出現在三個地方
在makefile中定義
在make命令行中定義
使用shell環境中的定義
優先級:
make命令行中定義 > 在makefile中定義 > 使用shell環境中的定義 > 預定義的變量
在Makefile中的CC= xxxxxx就會失效而執行 make後面的語句
make有許多預定義的變量,這些變量具有特殊的含義,可在規則中直接使用。¥
1.$*不包含擴展名的目標文件名稱
Main.o 可以寫成$*
2.$+所有的依賴文件,空格分開,並以出現的先後爲序,可能包含重複的依賴文件
3.$<第一個依賴文件的名稱
4.$?所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚
5.$@目標的完整名稱
6.$`所有的依賴文件,以空格分開,不包含重複的依賴文件
7.$%如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱,例如,如果目標文件爲
Mytarget.so(image.o)。則$@爲mytarget.so。而$%爲image.o
1.條件表達式的語法爲:
conditional-directive
text-if-true
endif
其中conditional-directive表示條件關鍵字,如“ifeq”。Makefile所支持的關鍵字有四個
ifeq
ifneq
ifdef
ifndef
2.for k in $(DIRS) ; do ……
k依次取變量DIRS中的每一個值,執行do後面的語句
例:
SUBDIRS=temp1 temp2
for i in $(SUBDIRS);
Do
make-C $$i||exit $?;
done
3.wildcard函數(通配符函數),其形式是:
$(wildcard _pattern)
通過該函數可得到當前工作目錄中滿足_pattern模
式的文件或目錄名列表。如:
SRCS:=$(wildcard *.c)
subst函數,格式爲:$(subst <from>, <to>, <text>)
該函數把字符串<text>中的<from>字符串替換爲<to>。函數返回被替換後的字符串。
patsubst函數,格式爲:
$(patsubst <pattern>, <replacement>, <text>)
查找<text>中的單詞(單詞以“空格”、“Tab”、“回車”分隔)是否符合模式<pattern>,若匹配的話,則以<replacement>模式替換,<pattern>可以包含通配符”%”,表示任意長度的字符串。若<replacement>中也包含“%”,則其所代表的的即爲<pattern>中的那個“%”所代表的的字符串。如:
OBJS:=$(patsubst %.c, %.o, x.c.c bar.c)
函數返回結果爲:x.c.o bar.o
例: SRCS:=$(wildcard *.c)
OBJS:=$(patsubst %.c,%.o,$(SRCS))
……
hello: $(OBJS)
$(CC) -o $@ $(OBJS)
模式規則(pattern rules)。這種規則更加通用,因爲可以利用模式規則定義更加複雜的依賴性規則。模式規則看起來非常類似於正則規則,但在目標名稱的前面多了一個 % 號,同時可用來定義目標和依賴文件之間的關係,例如下面的模式規則定義瞭如何將任意一個 X.c 文件轉換爲 X.o 文件
%.o:%.c
$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<
在makefile中,目標分爲兩類:實目標和僞目標
實目標--真正要生成、以文件形式放在磁盤上的目標。
例:
main.o:mai.c
$(CC) $(CCFLAGS) -c -o $@ $<
僞目標--不要求make生成實際的文件,而是使make程序執行一些與創建和維護目標文件沒有直接聯繫的輔助性操作,如打印信息、刪除文件。
例:
clean:
rm *.o
爲了避免和文件重名的這種情況,可以使用一個特殊的標記“.PHONY”來顯示地指明一個目標是“僞目標”
.PHONY: clean
clean:
rm *.o temp
外一個使用假想目標的例子是使用make的遞歸調用進行連接的情況:此時,makefile文件常常包含列舉一系列需要創建的子目錄變量。例:
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
僞目標也可以有依賴,例 :
.PHONY : all
all : prog1 prog2 prog3
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
……
缺省情況下,當make尋找makefile文件時,它試圖搜尋具有如下的名字的文件,按順序:‘GNUmakefile’、‘makefile’和‘Makefile’。
如果您使用非標準名字makefile文件,您可以使用‘-f’或‘--file’參數指定您的makefile文件。參數‘-f name’或‘--file=name’能夠告訴make讀名字爲‘name’的文件作爲makefile文件
在makefile後,就可以調用make命令生成和維護目標文件。命令格式爲:
Make [option] [macrodef] [target]
- Option指定make工作的行爲
- Macrodef給出執行makefile時的宏值
- Target是makefile中的目標之一
GNU的make工作時的執行步驟
- 讀入所有的Makefile
- 讀入被include的其它Makefile
- 初始化文件中的變量
- 推導隱晦規則,並分析所有規則
- 爲所有的目標文件創建依賴關係鏈
- 根據依賴關係,決定哪些目標要重新生成
- 執行生成命令
第一步:編輯源文件
#vi hello.c
第二步:建立makefile
#vi makefile
第三步:編輯makefile
(同一目錄下有多個.C文件,這些.C文件最後鏈接成可執行程序hello)
BIN=hello
SRCS:=$(wildcard *.c)
OBJS:=$(patsubst %.c,%.o,$(SRCS))
CC=gcc
all:$(BIN)
$(BIN):$(OBJS)
(CC) -o $(EXECPROGRAM) $(OBJS)
%.o:%.c
$(CC) -c -o $@ $<
clean:
rm –rf *.o $(BIN)
Linux下的圖形開發工具
Eclipse
Code blocks
Linux下的應用程序調試工具
Gdb
printf