close

http://jimmynuts.blogspot.com/2010/12/gnu-makefile.html
https://www.itread01.com/content/1496238002.html

 

makefile 規則的格式

一個簡單的Makefile檔檔案內容包含一系列的規則,其樣式如下:

目標(target): 依賴(prerequiries)
<tab> 命令 (command)

假設我們寫一個 makefile 內容如下,包含兩個規則,分別只印出一則訊息。

####Makefile內容######

rule1:
        echo "Hello Rule1"

rule2:  rule1
        echo "Hello Rule2"

執行結果==>

jimmy@ERX07-debian:~/test$ make rule1
echo "Hello Rule1"
Hello Rule1
jimmy@ERX07-debian:~/test$ make rule2
echo "Hello Rule1"
Hello Rule1
echo "Hello Rule2"
Hello Rule2

 

一個簡單的例子,定義了一個規則使您的目標從 hello 其他三個文件建出

####Makefile內容######

hello: main.o factorial.o hello.o
    $(CC) main.o factorial.o hello.o -o hello


變量定義 ( = or := )
OBJS = programA.o programB.o
OBJS-ADD = $(OBJS) programC.o
或者
OBJS := programA.o programB.o
OBJS-ADD := $(OBJS) programC.o
其中 = 和 := 的區別在於, := 只能使用前面定義好的變量, = 可以使用後面定義的


(1) 測試 =
####Makefile內容######
OBJS2 = $(OBJS1) programC.o
OBJS1 = programA.o programB.o

all:
    @echo $(OBJS2)

執行結果==>
jimmy@ubuntu:~$  make
programA.o programB.o programC.o

(2) 測試 :=

####Makefile內容######
OBJS2 := $(OBJS1) programC.o
OBJS1 := programA.o programB.o

all:
    @echo $(OBJS2)

執行結果==>
jimmy@ubuntu:~$ make
programC.o

(3) 變量追加值 +=

####Makefile內容######
SRCS := programA.c programB.c programC.c
SRCS += programD.c

all:
    @echo "SRCS: " $(SRCS)

執行結果==>
jimmy@ubuntu:~$ make
SRCS:  programA.c programB.c programC.c programD.c

 

使用變數簡化makefile檔

在我們的例子中,我們在‘edit’的生成規則中把所有的OBJ 檔列舉了兩次,這裏再重複一遍:
edit : main.o kbd.o command.o display.o \
           insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

在 makefile檔中使用名為objects, OBJECTS, objs, OBJS, obj, 或 OBJ 的變數代表所有
OBJ檔已是約定成俗。在這個makefile檔我們定義了名為objects的變數,其定義格式如下:
objects = main.o kbd.o command.o display.o \
                  insert.o search.o files.o utils.o

edit : $(objects)
         cc -o edit $(objects)

 

通配符在規則中可以自動擴展,但設置在變數中或在函數的參數中通配符一般不能正常
擴展。如果您需要在這些場合擴展通配符,您應該使用函數wildcard,格式如下:
$(wildcard pattern...)

使用函數wildcard得到指定目錄下所有的C語言根源程式檔案名的命令格式為:
       $(wildcard *.c)

####Makefile內容######

rule1:
        @echo $(wildcard *.c)

執行結果==>

jimmy@ERX07-debian:~/test$ make rule1
code1.c


我們可以把所獲得的C 語言根源程式檔案名的字元串通過將‘.c’尾碼變為‘.o’轉換為OBJ 檔
案名的字串,其格式為:
     @echo  $(patsubst %.c,%.o,$(wildcard *.c))

####Makefile內容######

rule1:
        @echo  $(patsubst %.c,%.o,$(wildcard *.c))

執行結果==>

  jimmy@ERX07-debian:~/test$ make rule1
code1.o

 

 

使用變數

變數是在makefile中定義的名字,其用來代替一個文本字串,該文本字串稱為該變數的
值。在具體要求下,這些值可以代替目標、依賴、命令以及makefile 檔中其他部分。(在其
他版本的make中,變數稱為巨集(macros)。)

在 makefile檔讀入時,除規則中的shell命令、使用‘=’定義的‘=’右邊的變數、以及使用
define指令定義的變數體此時不擴展外,makefile檔其他各個部分的變數和函數都將擴展。

變數名是不包括‘:',‘#',‘='、前導或結尾空格的任何字串。然而變數名包含字母、數位以
及下劃線以外的其他字元的情況應儘量避免,因為它們可能在將來被賦予特別的含義。變數名是
大小寫敏感的,例如變數名‘foo', ‘FOO', 和 ‘Foo'代表不同的變數。

 

變數引用基礎

寫一個美元符號後跟用圓括號或大括弧括住變數名則可引用變數的值:‘$(foo)' 和
‘${foo}'都是對變數‘foo’的有效引用。

變數的引用可以用在上下文的任何地方:目標、依賴、命令、絕大多數指令以及新變數
的值等等。這裏有一個常見的例子,在程式中,變數保存著所有OBJ 檔的檔案名:
objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)

 

如果您喜歡僅對沒有定義過的變數賦給值,您可以使用速記符‘?=’代替‘=’。下面兩種設
置變數的方式完全等同(參閱函數origin):
FOO ?= bar

ifeq ($(origin FOO), undefined)
FOO = bar
endif

 

為變數值追加文本
為已經定以過的變數的值追加更多的文本一般比較有用。您可以在獨立行中使用‘+=’
來實現上述設想。如:
objects += another.o
這為變數objects的值添加了文本‘another.o’(其前面有一個前導空格)。這樣:
objects = main.o foo.o bar.o utils.o
objects += another.o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


make 退出碼
Makefile的退出碼有以下3種:

0 :: 表示成功執行
1 :: 表示make命令出現了錯誤
2 :: 使用了 "-q" 選項, 並且make使得一些目標不需要更新
 

arrow
arrow
    創作者介紹
    創作者 kingsman 的頭像
    kingsman

    Kingsman的部落格

    kingsman 發表在 痞客邦 留言(0) 人氣()