如何调用其他makefile中的指定target,避免执行全量逻辑报错
问题根因
GNU Make的执行分为两个阶段:第一阶段会完整解析整个Makefile的所有内容,包括变量定义、include指令、规则声明等,所有解析工作完成后才会进入第二阶段,执行你指定的target对应的构建逻辑。
所以不管你指定运行哪个target,include语句都会在解析阶段被处理,这是make的默认工作逻辑,不是你的调用命令错误导致的。
从你贴出的Makefile片段来看,当前解析报错的核心问题有两个:
- 你直接覆盖了系统内置环境变量
PATH,这个变量是shell用来查找系统命令的,覆盖后后续所有调用系统工具的逻辑都会找不到命令,直接报错 - 如果
directory路径不存在,或者该路径下没有config.cfg文件,include语句找不到对应文件就会直接终止运行,根本走不到执行target的步骤
解决方案
方案1:不需要用到config.cfg内容的场景
如果你要执行的target完全不需要用到include进来的配置内容,可以用条件判断包裹include语句,按需引入配置:
### 修改后的MAKEFILE片段### .SILENT PROJCONFIG := ${PROJ_CFG} # 不要占用系统PATH变量,换自定义变量名 PROJ_PATH := directory ifndef SKIP_CONFIG include ${PROJ_PATH}/config.cfg endif
调用时传入参数跳过配置引入即可:
${MAKE} target -f makefile-location SKIP_CONFIG=1
方案2:需要用到config.cfg内容的场景
如果目标target的执行依赖config.cfg里的配置,需要先修复Makefile里的路径和变量问题:
- 将自定义路径变量的名字从
PATH改为其他不冲突的名字,比如PROJ_PATH - 提前校验配置文件是否存在,避免无意义的报错
修改后的片段参考:
### 修改后的MAKEFILE片段### .SILENT PROJCONFIG := ${PROJ_CFG} PROJ_PATH := directory # 先判断配置文件是否存在 ifeq ($(wildcard $(PROJ_PATH)/config.cfg),) $(error 配置文件 $(PROJ_PATH)/config.cfg 不存在,请检查路径配置) endif include ${PROJ_PATH}/config.cfg
你原来的${MAKE} target -f makefile-location调用命令本身是符合规范的,不需要调整。
内容的提问来源于stack exchange,提问作者Abdullah Shakir
相关产品推荐
相关产品推荐

