makefile腳本編寫總結

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環境中的定義 預定義的變量 

spacer.gif 

Makefile中的CC= xxxxxx就會失效而執行  make後面的語句

 

make有許多預定義的變量,這些變量具有特殊的含義,可在規則中直接使用。¥

 

 

1.$*不包含擴展名的目標文件名稱

  Main.o  可以寫成$*

2.$+所有的依賴文件,空格分開,並以出現的先後爲序,可能包含重複的依賴文件

3.$<第一個依賴文件的名稱

4.$?所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚

5.$@目標的完整名稱

6.$`所有的依賴文件,以空格分開,不包含重複的依賴文件

7.$%如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱,例如,如果目標文件爲

 Mytarget.soimage.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>。函數返回被替換後的字符串。

spacer.gif

 

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)

spacer.gif 

 

 

spacer.gif 

 

模式規則(pattern rules)。這種規則更加通用,因爲可以利用模式規則定義更加複雜的依賴性規則。模式規則看起來非常類似於正則規則,但在目標名稱的前面多了一個 號,同時可用來定義目標和依賴文件之間的關係,例如下面的模式規則定義瞭如何將任意一個 X.c 文件轉換爲 X.o 文件

%.o:%.c

 $(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<

spacer.gif 

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時的宏值

- Targetmakefile中的目標之一

GNUmake工作時的執行步驟

- 讀入所有的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


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