Makefile 原文
include ../Makefile.param
#ifeq ($(SAMPLE_PARAM_FILE), )
# SAMPLE_PARAM_FILE:=../Makefile.param
# include $(SAMPLE_PARAM_FILE)
#endif
# target source
SRC := $(wildcard *.c)
OBJ := $(SRC:%.c=%.o)
MPI_LIBS := $(REL_LIB)/libmpi.a
MPI_LIBS += $(REL_LIB)/libhdmi.a
TARGET := $(OBJ:%.o=%)
.PHONY : clean all
all: $(TARGET)
$(TARGET):%:%.o $(COMM_OBJ)
$(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA)
clean:
@rm -f $(TARGET)
@rm -f $(OBJ)
@rm -f $(COMM_OBJ)
cleanstream:
@rm -f *.h264
@rm -f *.jpg
@rm -f *.mjp
@rm -f *.mp4
解析
include
include ../Makefile.param
在Makefile也和C語言一樣有include的用法,include后面跟一個Makefile文件名,其功能和C語言中的include類似,就是把被包含的Makefile文件的內容全部原本的復制到包含文件中來。
這個用法多用於在一個項目中有多個Makefile,分別在不同的目錄下,這樣我 們可以寫一個公共Makefile,這個Makefile中包含一些公共變量的定義,其他目錄下的Makefile可以把這個公共Makefile文件包含進去。
SRC := $(wildcard *.c)
SRC := $(wildcard *.c)
變量的定義
#方式一:定義多行變量
define variable
value
value
endef
#方式二:
variable = value
#方式三:
variable := value
#方式四:
variable += value
#方式五:
variable ?= value
這些定義方式中,按照展開方式不同分為:
- 方式一、方式二、方式五,都是使用時展開,就是無論前面如何定義,變量真正的含義都是到使用的時候才展開,這樣定義的變量可以遞歸引用當前還未定義的變量;
- 方式三是直接展開,就是變量定義的時候就展開為真正的值,這樣定義的變量不可以遞歸引用當前還未定義的變量;
- 方式四是追加變量,他的展開方式要看原有的變量是如何定義的。
變量的引用
變量的引用可以采用兩種方式:
$(variable)
${variable}
wildcard
一般我們可以使用下面這一句來獲取工作目錄下的所有的.c文件列表:
$(wildcard *.c)
在Makefile規則中,通配符會被自動展開。但在變量的定義和函數引用時,通配符將失效。這種情況下如果需要通配符有效,就需要使用函數wildcard,它的用法是:
$(wildcard PATTERN...)
在Makefile中,它被展開為已經存在的、使用空格分開的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函數會忽略模式字符並返回空。
OBJ := $(SRC:%.c=%.o)
OBJ := $(SRC:%.c=%.o)
這里用到makefile里的替換引用規則,即用您指定的變量替換另一個變量。它的標准格式是:
$(var:a=b) 或 ${var:a=b}
它的含義是把變量var中的每一個值結尾用b替換掉a。
%
%”的意思是匹配零或若干字符,例如:
%.h
表示所有以“.h”結尾的文件,它是在GUNmake的語法層次上的,例如
vpath %.h ../headers
該語句表示,要求make在“../headers”目錄下搜索所有以“.h”結尾的文件.
*
是Shell所支持的通配符,是在shell的語法層次上,*.c
,一般用在shell命令里面,如:
clean:
rm -f *.o
.PHONY : clean all
.PHONY : clean all
關鍵字.PHONY
告訴make該目標是“假的”(磁盤上其實沒有clean),這時make為生成這個目標就會將其規則執行一次。.PHONY
修飾的目標就是只有規則沒有依賴。
all: $(TARGET)
表示所有的目標(一個或者多個目標)
$@ $^
- $@--目標文件
- $^--所有的依賴文件
- $<--第一個依賴文件
@rm -f $(TARGET)
@rm -f $(TARGET)
其中 @ 表示:如果 makefile 文件中執行的命令前面加了@字符,則不顯示命令本身而只顯示它的結果。