請閱讀【ARM GCC 編譯專欄導讀】
上篇文章:【ARM 嵌入式 編譯系列 2.1 – GCC 編譯參數學習】
下篇文章:【ARM 嵌入式 編譯系列 2.3 – GCC 中指定 ARMv8-M 的 Thumb 指令集參數詳細介紹】
文章目錄
- 編譯參數介紹
編譯參數介紹
通常我們在 OS 啟動的時候我們可以在串口log中看到 當前使用的鏡像的編譯時間、是誰編譯的,當前鏡像是基于哪個 git commit編譯的?我們如何在編譯過程中添加這些參數呢?
通過下面命令獲取當前時間:
$ date +"%Y-%m-%d-%H-%M-%S"
2022-12-20-10-29-31
通過下面命令獲取當前用戶:
$ whoami
CodingCos
通過下面命令獲取當前 git id
$ git log -1 --pretty=format:'%H'9c7085ed92eeeac5836f540511c65e5190975d46
我們只需要將上面獲取到的值在 Makefile 中賦值給相應的變量, 然后使用 export
將其從Makefile導出到由Makefile啟動的子進程的環境中即可,如下:
COMPILE_TIME_DATE := $(shell date +"%Y-%m-%d-%H-%M-%S")
COMPILE_USER_NAME := $(shell whoami)
COMPILE_COMMIT_ID := $(shell git log -1 --pretty=format:'%H')export COMPILE_TIME_DATE
export COMPILE_USER_NAME
export COMPILE_COMMIT_ID
關于 Makefile 中 export 的使用
在編的時候將上面定義的參數以宏的形式進行定義, 如下:
PARCFLAGS += -DCOMPILE_TIME_DATE=$(COMPILE_TIME_DATE) -DCOMPILE_USER_NAME=$(COMPILE_USER_NAME) -DCOMPILE_COMMIT_ID=$(COMPILE_COMMIT_ID) \
在編譯的時候使用 參數 OBJCFLAGS
即可,如下:
ifeq ($(CROSS_COMPILE), )CROSS_COMPILE = arm-none-eabi-
endif
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
GDB = $(CROSS_COMPILE)gdb
OBJDUMP = $(CROSS_COMPILE)objdump
OBJCOPY = $(CROSS_COMPILE)objcopy
READELF = $(CROSS_COMPILE)readelfall:%.o: %.c@echo -e "\t c " CC $(CFLAGS) $< -o $@@$(CC) $(PARCFLAGS) $< -o $@%.o: %.S@echo -e "\t s " CC $(OBJCFLAGS) $< -o $@@$(CC) $(OBJCFLAGS) $< -o $@
上篇文章:【ARM 嵌入式 編譯系列 2.1 – GCC 編譯參數學習】
下篇文章:【ARM 嵌入式 編譯系列 2.3 – GCC 中指定 ARMv8-M 的 Thumb 指令集參數詳細介紹】