yb_arm/makefile

199 lines
7.8 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#========================================================================================================
# platform makefile
# FileName: makefile
# Author: xianfeng.du
# Date: 2022-08-10
# Description: 项目管理主Makefile控制代码编译和链接流程
#========================================================================================================
VERSION = 1.00 # 定义Makefile版本号
#---------------------------------------------------------------------
# 编译器配置
#---------------------------------------------------------------------
# 选择编译工具链(默认使用交叉编译)
OPTION ?=
ifeq ($(OPTION),GCC) # 如果手动指定GCC则用本地gcc
CROSS_CC ?= # 使用系统默认gcc
else
# 示例交叉编译工具链路径(当前注释状态)
#TOOLS ?= /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
#CROSS_CC ?= $(TOOLS)/aarch64-linux-gnu-
CROSS_CC ?= aarch64-linux-gnu- # 默认交叉编译工具前缀
endif
AR = ar # 静态库打包工具
CC = $(CROSS_CC)gcc # C编译器定义
#$(info "CC=" $(CC)) # 调试信息:显示当前使用的编译器
#---------------------------------------------------------------------
# 宏定义配置
#---------------------------------------------------------------------
DEFINES ?= # 初始化空宏定义
#DEFINES ?= UBLOX_ENABLE # 示例宏定义(当前注释状态)
# 通过环境变量传递的版本信息来自shell脚本
DEFINES += ARM_VERSION=\"${arm_version}\" # Git commit版本
DEFINES += ARM_TAG=\"${arm_tag}\" # Git标签版本
DEFINES += ARM_BUILD_DATE=\"${arm_build_date}\" # 构建时间
# 前传接口条件编译
ifeq ($(fronthaul_option),jesd)
DEFINES += ENABLE_JESD_TEST # 启用JESD测试
# PCIe与JESD的组合支持
ifeq ($(backhaul_option),pcie)
DEFINES += PCIE_WITH_JESD
endif
endif
#---------------------------------------------------------------------
# 编译选项
#---------------------------------------------------------------------
C_OPT_FLAGS ?= -O2 # 优化级别设置为O2
# 公共编译选项
CC_FLAGS ?= $(C_OPT_FLAGS) -Wall -g # 基本选项O2优化显示所有警告生成调试信息
CC_FLAGS += -Werror -Wno-unused-function # 将警告视为错误(除未使用函数警告)
CC_FLAGS += $(foreach d,$(DEFINES),-D$(d)) # 添加所有宏定义
CC_FLAGS += -fPIC # 生成位置无关代码(用于库文件)
LIB_DIRS ?= ./lib # 库文件搜索目录
#---------------------------------------------------------------------
# 源文件配置
#---------------------------------------------------------------------
SRC_DIRS ?= ./app/src # 主程序源码目录
SRC_DIRS += ./osp/src # 操作系统抽象层源码
SRC_DIRS += ./driver/arm_csu/src # ARM CSU驱动源码
SRC_DIRS += ./driver/init/src # 初始化模块源码
# 头文件包含路径配置
INCLUDE_DIRS ?= ./app/inc
INCLUDE_DIRS += ./osp/inc
INCLUDE_DIRS += ./driver/arm_csu/inc
INCLUDE_DIRS += ./driver/init/inc
INCLUDE_DIRS += ./driver/tfu/stc/inc # TFU驱动头文件
# 测试用例配置(通过--test参数激活
test ?= $(test_option) # 是否启用测试模式
case ?= $(test_id) # 测试用例ID
ifeq ($(test),yes)
DEFINES += PALLADIUM_TEST # 定义测试模式宏
# 添加测试用例目录
CASE_ID := $(case)
TEST_DIR := ./test/case$(CASE_ID)
SRC_DIRS += $(TEST_DIR)/src # 测试用例源码目录
INCLUDE_DIRS += $(TEST_DIR)/inc # 测试用例头文件目录
endif
# 缓存功能配置(通过--cache参数激活
cache ?= $(cache_option)
ifeq ($(cache),yes)
DEFINES += CACHE_ENABLE # 开启缓存功能宏
endif
#---------------------------------------------------------------------
# 链接选项
#---------------------------------------------------------------------
LD_FLAGS ?= -lgcc -lc # 基础C库
LD_FLAGS += -lm -ldl -Wl,-rpath=./ # 数学库、动态加载库、运行时路径
LD_FLAGS += -lpthread # 线程库
LD_FLAGS += -rdynamic -funwind-tables -ffunction-sections # 动态符号表相关
# 根据前传接口添加特定库
ifeq ($(fronthaul_option),jesd)
LD_FLAGS += -lrfic -lstc # JESD模式需要rfic和stc库
endif
LD_FLAGS += -lstc # 默认链接stc库
$(info "DEFINES=" $(DEFINES)) # 打印最终的宏定义(调试用)
#---------------------------------------------------------------------
# 文件收集与处理
#---------------------------------------------------------------------
# 获取所有源码目录的绝对路径
ABS_SRC_DIRS := $(foreach d,$(SRC_DIRS),$(abspath $(d)))
# 收集所有.c文件使用通配符匹配
SRC_FILES := $(foreach d,$(ABS_SRC_DIRS),$(wildcard $(d)/*.c))
# 主函数文件特殊处理
MAIN_DIR := ./app/src
MAIN_FILE := ./app/src/main.c # 主程序入口文件
# 需要排除的源文件列表(如主程序文件单独处理)
EXCL_SRCS ?= $(MAIN_FILE)
#EXCL_SRCS += ./app/src/main.c # 示例其他排除文件(当前注释状态)
# 过滤生成最终参与编译的源文件列表
FINAL_SRCS_FILES += $(foreach f,$(SRC_FILES),$(if $(findstring $(abspath $(f)),$(abspath $(EXCL_SRCS))),,$(f)))
#$(info "FINAL_SRCS_FILES=" $(FINAL_SRCS_FILES)) # 调试输出最终文件列表
#---------------------------------------------------------------------
# 输出文件定义
#---------------------------------------------------------------------
BUILD_DIR := ./build # 构建输出根目录
OBJ_MAIN_DIR := $(BUILD_DIR)/main # 主程序对象文件目录
OBJ_DIR := $(BUILD_DIR)/obj # 常规对象文件目录
BIN_FILE := $(BUILD_DIR)/msgtransfer.out # 最终生成的可执行文件
LIB_FILE := $(BUILD_DIR)/libmsgtransfer.a # 生成的静态库文件
# 生成对象文件路径列表(普通文件)
OBJ_FILES += $(foreach f,$(FINAL_SRCS_FILES),$(OBJ_DIR)/$(patsubst %.c,%.o,$(notdir $(f))))
# 生成主程序对象文件路径列表
OBJ_MAIN_FILES += $(foreach f,$(MAIN_FILE),$(OBJ_MAIN_DIR)/$(patsubst %.c,%.o,$(notdir $(f))))
#---------------------------------------------------------------------
# 编译规则定义
#---------------------------------------------------------------------
# 定义对象文件生成规则模板
define DO_BUILD_OBJ
$(2)/%.o: $(1)/%.c | $(2)
@echo "# 正在编译 $$< -> $$@" # 显示编译进度
$(CC) $(CC_FLAGS) -o $$@ -c $$< $(patsubst %,-I %,$(INCLUDE_DIRS)) # 编译命令
endef
# 定义目录创建规则模板
define DO_BUILD_DIR
$(1):
@echo "# 创建目录 $$@"
mkdir -p $$@
endef
# 组合构建规则:创建目录 + 编译源文件
define DO_BUILD
$(eval $(call DO_BUILD_DIR,$(1))) # 先创建目录
$(foreach d,$(sort $(2)),$(eval $(call DO_BUILD_OBJ,$(d),$(1)))) # 遍历编译每个目录
endef
# 应用构建规则到常规对象目录和主程序对象目录
$(eval $(call DO_BUILD,$(OBJ_DIR),$(ABS_SRC_DIRS)))
$(eval $(call DO_BUILD,$(OBJ_MAIN_DIR), $(abspath $(MAIN_DIR))))
# 可执行文件链接规则
$(BIN_FILE):$(OBJ_FILES) $(OBJ_MAIN_FILES)
@echo "# 正在链接对象文件生成 $@"
$(CC) -o $@ $^ $(LD_FLAGS) $(patsubst %,-L %,$(LIB_DIRS)) # 链接所有对象文件
# 静态库生成规则
$(LIB_FILE):$(OBJ_FILES)
@echo "# 正在生成静态库 $@"
$(AR) -rcs $@ $^ # 使用ar工具打包对象文件
#---------------------------------------------------------------------
# 目标规则
#---------------------------------------------------------------------
.DEFAULT_GOAL := all # 默认目标为all
.PHONY: build lib clean # 声明伪目标
all: build lib # 默认目标:同时构建可执行文件和库
build: $(BIN_FILE) # 构建可执行文件
lib: $(LIB_FILE) # 构建静态库
clean: # 清理构建产物
@echo "正在删除所有构建文件..."
rm -rf $(BUILD_DIR)