海思的一個 Makefile 解析


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 文件中執行的命令前面加了@字符,則不顯示命令本身而只顯示它的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM