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