如何在Makefile中排除第三方仓库文件以满足MISRA合规要求
解决MISRA合规中排除外部仓库代码检查的Makefile方案
核心思路:将自有代码与外部ADDED_REPO的代码拆分编译,仅对自有代码启用MISRA规则检查,外部仓库代码使用不带MISRA参数的编译选项,以下是具体修改步骤:
拆分源文件列表
在Makefile中区分自有代码和外部仓库的源文件:# 匹配ADDED_REPO目录下的所有C源文件 ADDED_REPO_SOURCES := $(wildcard $(SRC_DIR)/SW/ADDED_REPO/*.c) # 从全局源文件中排除外部仓库文件,得到自有代码源文件(若未定义SOURCES,可直接收集自有文件) MY_SOURCES := $(filter-out $(ADDED_REPO_SOURCES), $(SOURCES))若未定义
SOURCES,可直接指定自有代码路径,例如:MY_SOURCES := $(wildcard $(SRC_DIR)/SW/*.c $(SRC_DIR)/SW/[!ADDED_REPO]/*.c)拆分编译选项
将原有的统一CFLAGS拆分为基础选项和带MISRA检查的选项:# 基础编译选项(不含MISRA规则) BASE_CFLAGS = -o "$@" # 自有代码编译选项(启用MISRA检查) MY_CFLAGS = $(BASE_CFLAGS) --misrac=$(MISRA_RULES) --misra-version2004 # 外部仓库编译选项(仅使用基础选项) ADDED_REPO_CFLAGS = $(BASE_CFLAGS)添加分文件编译规则
为两类源文件分别编写编译规则,确保各自使用对应选项:# 编译自有代码生成目标文件 $(OBJ_DIR)/%.o: %.c ifneq ($(filter $<, $(ADDED_REPO_SOURCES)),) # 匹配到外部仓库文件,禁用MISRA检查 $(CC) $(ADDED_REPO_CFLAGS) $(ADDITIONAL_INCLUDES) -c $< -o $@ else # 自有代码,启用MISRA检查 $(CC) $(MY_CFLAGS) $(ADDITIONAL_INCLUDES) -c $< -o $@ endif也可采用更清晰的拆分规则(推荐):
# 编译自有代码 $(OBJ_DIR)/%.o: $(MY_SOURCES) $(CC) $(MY_CFLAGS) $(ADDITIONAL_INCLUDES) -c $< -o $@ # 创建外部仓库目标文件的专属目录(避免与自有文件冲突) $(OBJ_DIR)/added_repo: @mkdir -p $@ # 编译外部仓库代码 $(OBJ_DIR)/added_repo/%.o: $(SRC_DIR)/SW/ADDED_REPO/%.c | $(OBJ_DIR)/added_repo $(CC) $(ADDED_REPO_CFLAGS) $(ADDITIONAL_INCLUDES) -c $< -o $@更新链接目标
确保链接阶段包含所有目标文件:# 收集自有代码的目标文件 MY_OBJS := $(MY_SOURCES:%.c=$(OBJ_DIR)/%.o) # 收集外部仓库的目标文件 ADDED_REPO_OBJS := $(ADDED_REPO_SOURCES:$(SRC_DIR)/SW/ADDED_REPO/%.c=$(OBJ_DIR)/added_repo/%.o) # 最终可执行文件目标 TARGET := your_output.elf $(TARGET): $(MY_OBJS) $(ADDED_REPO_OBJS) $(CC) $^ -o $@
补充说明
- 需确保Makefile中已定义编译器变量
CC(如gcc或对应嵌入式编译器)。 - 根据实际目录结构(如
OBJ_DIR路径、源文件嵌套层级)调整路径匹配规则。 - 若使用的编译器支持
--misra-exclude类参数,可直接通过该参数指定排除ADDED_REPO目录,无需拆分编译规则,但上述分编译方案通用性更强。
内容的提问来源于stack exchange,提问作者Fatpanda
相关产品推荐
相关产品推荐

