1. 程式人生 > >~雜記:makefile檔案分析

~雜記:makefile檔案分析

1、makefile 檔案分析(部分資訊,做出替換修改)。

2、相關注釋資訊作為經驗交流點。

3、如有註釋錯誤的請指正。

#	 = 是最基本的賦值
#	:= 是覆蓋之前的值
#	?= 是如果沒有被賦值過就賦予等號後面的值
#	+= 是新增等號後面的值	

#c編譯器
CC=gcc
#C++編譯器
CPP=g++
#聯結器(ld命令)
LD=ld
#生成靜態庫的編譯器(ar命令)
AR=ar
#目標輸出地址
BUILD_DIR=build
#檔案模式
FILE_PATTERN = "*flag_operate*.c"
FOR32 := true
#生成的可執行檔案
BIN:= bin
#需要生成的靜態連結庫檔案(依賴列表)
LIB:= $(BUILD_DIR)/mylib.a
#工程的上層目錄
MY_PROJECTDIR:=../../../../


#美元符號$,主要擴充套件開啟makefile中定義的變數
#CFLAGS 表示用於 C 編譯器的選項,涵蓋了編譯和彙編兩個步驟。
ifeq ($(FOR32), true)	
CFLAGS := -m32  -mdir2=i386 -mtune=i386
else
CFLAGS := 
endif
#為C編譯器 新增其他資訊
CFLAGS += -w -DSTM32F429xx -DUSE_HAL_DRIVER -DUSE_MBED_TLS -DMBEDTLS_CONFIG_FILE="<my_mbedtls_config.h>" -DLWM2M_LITTLE_ENDIAN -DWITH_LWIP -DWITH_LINUX -DLWM2M_CLIENT_MODE -DNDEBUG
CFLAGS += -DCONFIG_FEATURE_FOTA -DATINY_DEBUG
CFLAGS += -DWITH_LOGS
CFLAGS += -DLWIP_TIMEVAL_PRIVATE=0 -DBYTE_ORDER -DLWIP_COMPAT_SOCKETS=0
CFLAGS += -fprofile-arcs -ftest-coverage
CFLAGS += -DUSE_BOOTLOADER

#GCOV+LCOV 程式碼除錯和覆蓋率統計工具
GCOV_FLAGS := --rc lcov_branch_coverage=1 --rc  genhtml_branch_coverage=1

#compile dynamic library of liteos module	
# 取出 $(MY_PROJECTDIR)/dir1/ota/utility/*.c ,$(MY_PROJECTDIR)/dir1/ota/flag_operate/*.c ,$(MY_PROJECTDIR)/dir5/stub/*.c
# 注意這裡只有第一個等式 用“:=” ,其他的用 “+=”
SRC:= $(wildcard $(MY_PROJECTDIR)/dir1/ota/utility/*.c)
SRC+= $(wildcard $(MY_PROJECTDIR)/dir1/ota/flag_operate/*.c)
SRC+= $(wildcard $(MY_PROJECTDIR)/dir5/stub/*.c)

#從上述模組SRC中取出c檔案,並指定目標輸出地址。這些資訊存放在LIB_OBJ中
LIB_OBJ:=$(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.c, %.o, $(SRC))))

#在其它目錄下搜尋目標和依賴呢?在Makefile中可以使用VPATH或者vpath
vpath %.c $(sort $(dir $(SRC)))

#標頭檔案路徑
INCLUDES:= \
	-I$(MY_PROJECTDIR)/dir2/arm/common/cmsis/ \
	-I$(MY_PROJECTDIR)/dir2/arm/arm-m/include/ \
	-I$(MY_PROJECTDIR)/dir2/arm/arm-m/cortex-m4/ \
	-I$(MY_PROJECTDIR)/dir1/cmsis/ \
	-I$(MY_PROJECTDIR)/dir1/dir11/dir111/comm/include/ \
    -I$(MY_PROJECTDIR)/dir1/dir11/dir111/examples/ \
    -I$(MY_PROJECTDIR)/dir1/dir11/dir111/firmware_update/ \
	-I$(MY_PROJECTDIR)/dir1/dir11/dir111/lwm2m_client/ \
	-I$(MY_PROJECTDIR)/dir1/dir11/dir111/lwm2m_client/fota/ \
    -I$(MY_PROJECTDIR)/dir1/dir11/dir111/mqtt_client/ \
	-I$(MY_PROJECTDIR)/dir1/dir11/dir111/osadapter/ \
    -I$(MY_PROJECTDIR)/dir1/dir11/at_frame/ \
	-I$(MY_PROJECTDIR)/dir1/dir11/lwm2m/core/ \
	-I$(MY_PROJECTDIR)/dir5/stub/
	
#“$(wildcard *.cpp)”來獲取工作目錄下的所有的.cpp檔案列表(即 test_XXX.cpp 和 main.cpp)
CPP_SRC := $(wildcard *.cpp)
#從上述模組CPP_SRC中取出c檔案,並指定目標輸出地址。這些資訊存放在CPP_OBJ中
CPP_OBJ = $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.cpp, %.o, $(CPP_SRC))))

# 使用wildcard萬用字元 獲取當前路徑下 所有的C檔案 (包括子目錄下的C檔案),儲存到C_SRC中
C_SRC   := $(wildcard *.c)
#將上述的所有的C檔案生成O檔案,儲存到指定路徑下。
C_OBJ:=$(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.c, %.o, $(C_SRC))))

all:$(BUILD_DIR) lib $(BIN) 
	@echo "ota OK"
lib:$(LIB)
TEST_GCDA:=$(patsubst %.o, %.gcda, $(CPP_OBJ))
TEST_GCDA+=$(patsubst %.o, %.gcda, $(C_OBJ))
TEST_GCDA+=$(patsubst %.o, %.gcda, $(LIB_OBJ))
	
TEST_GCNO:=$(patsubst %.o, %.gcno, $(CPP_OBJ))
TEST_GCNO+=$(patsubst %.o, %.gcno, $(C_OBJ))
TEST_GCNO+=$(patsubst %.o, %.gcno, $(LIB_OBJ))
	
#		$(BIN)					是目標bin檔案 
#		$(C_OBJ)和$(CPP_OBJ)	是需要生成的O檔案的檔名
#		@$(CPP) 				表示G++編譯器
#		$(CFLAGS)				表示C編譯器的配置引數
#		$(INCLUDES)				表示標頭檔案路徑
#		-o						後面接編譯輸出的檔名
#		
[email protected]
是Makefile的萬用字元,代指你前面指定的檔名 # $< 表示搜尋到的第一個匹配的檔案 # $^ 表示依賴列表 #https://www.cnblogs.com/alan666/p/8311984.html #-I(大寫的i)引數是用來指定標頭檔案目錄(前面有使用) #-L引數跟著的是庫檔案所在的目錄名 #-l引數就是用來指定程式要連結的庫,-l引數緊接著就是庫名。 #pthread是動態庫,需要用-lpthread,所有的動態庫都需要用-lxxx來引用,包括-lliteos -lcpptest #下面這句話可以看成:g++ (配置資訊) -I(標頭檔案路徑) -o bin 依賴列表 動態連結 $(BIN):$(C_OBJ) $(CPP_OBJ) @$(CPP) $(CFLAGS) $(INCLUDES) -o
[email protected]
$^ -lliteos -L$(BUILD_DIR) -lcpptest -lpthread #下面這句話可以看成:g++ -c 目標CPP檔案 -I(標頭檔案路徑) (配置資訊) -o O檔案 $(CPP_OBJ):$(BUILD_DIR)/%.o:%.cpp @$(CPP) -c $< $(INCLUDES) $(CFLAGS) -o [email protected] #下面這句話可以看成:gcc -c 目標C檔案 -I(標頭檔案路徑) (配置資訊) -o O檔案 $(C_OBJ):$(BUILD_DIR)/%.o:%.c @$(CC) -c $< $(INCLUDES) $(CFLAGS) -o
[email protected]
#生成靜態連結庫(LIB:= build/mylib.a) #下面這句話可以看成:ar -r build/mylib.a 依賴列表 $(LIB):$(LIB_OBJ) @$(AR) -r [email protected] $^ #$(LIB_OBJ) 是生成庫的中間檔案,O檔案 #下面這句話可以看成:gcc (配置資訊) -I(標頭檔案路徑) -c 目標C檔案 -o O檔案 $(LIB_OBJ):$(BUILD_DIR)/%.o:%.c @$(CC) $(CFLAGS) $(INCLUDES) -c $< -o [email protected] #建立build資料夾 $(BUILD_DIR): @mkdir -p $(BUILD_DIR) # make clean clean: rm -rf $(BUILD_DIR) bin gcov *.htm *.log # make run 執行bin檔案 run: ./$(BIN) # make cov 生成gcov資料夾,得到覆蓋率相關資訊 cov: mkdir -p gcov ./$(BIN) lcov -c -o gcov/gcov.info -d . -b . --rc lcov_branch_coverage=1 lcov -e gcov/gcov.info $(FILE_PATTERN) -o gcov/gcov.info --rc lcov_branch_coverage=1 genhtml -o gcov/html gcov/gcov.info --rc genhtml_branch_coverage=1 # make memcheck 記憶體檢查 memcheck: valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes --smc-check=all ./$(BIN) 2>&1 | tee memcheck.log