Makefile 語法

Refs:

Makefile用法(call,origin,shell,foreach)

Makefile文件教程

阮一峰的网络日志 Make 命令教程

印值

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

results matching ""

    No results matching ""