You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Makefile中排除第三方仓库文件以满足MISRA合规要求

解决MISRA合规中排除外部仓库代码检查的Makefile方案

核心思路:将自有代码与外部ADDED_REPO的代码拆分编译,仅对自有代码启用MISRA规则检查,外部仓库代码使用不带MISRA参数的编译选项,以下是具体修改步骤:

  1. 拆分源文件列表
    在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)
    
  2. 拆分编译选项
    将原有的统一CFLAGS拆分为基础选项和带MISRA检查的选项:

    # 基础编译选项(不含MISRA规则)
    BASE_CFLAGS = -o "$@"
    # 自有代码编译选项(启用MISRA检查)
    MY_CFLAGS = $(BASE_CFLAGS) --misrac=$(MISRA_RULES) --misra-version2004
    # 外部仓库编译选项(仅使用基础选项)
    ADDED_REPO_CFLAGS = $(BASE_CFLAGS)
    
  3. 添加分文件编译规则
    为两类源文件分别编写编译规则,确保各自使用对应选项:

    # 编译自有代码生成目标文件
    $(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 $@
    
  4. 更新链接目标
    确保链接阶段包含所有目标文件:

    # 收集自有代码的目标文件
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:37:29