跨makefile调用时提示${CFG_PATH}/makefile.cfg不存在问题求助
问题原因
Make 解析相对路径时,默认以执行make命令的工作目录为基准,而非makefile文件本身的存放目录:
- 直接在目标makefile所在目录执行时,
CFG_PATH := cfg_path指向的是当前目录下的cfg_path子目录,路径匹配所以能正常加载配置 - 从其他目录通过
-f参数指定该makefile执行时,make的工作目录仍是执行调用命令的目录,此时相对路径${CFG_PATH}/makefile.cfg会从当前工作目录下查找,自然找不到存放在${makefile_location}下的对应配置文件,触发不存在报错。
解决方案
可根据实际场景选择以下任意一种方案修复:
方案1(无需修改原makefile,优先推荐):调用时通过
-C参数切换工作目录到目标makefile所在目录,命令修改为:${MAKE} Target -C ${makefile_location}-C参数会让make先切换到指定目录,再执行后续逻辑,所有相对路径都会以该目录为基准,执行完成后会自动回到原工作目录。方案2(无需修改调用命令,通用性最高):修改原makefile,动态获取自身所在目录,将CFG_PATH改为基于该目录的路径,修改后代码如下:
# 获取当前makefile的所在绝对目录 SELF_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) CFG_PATH := ${SELF_DIR}/cfg_path include ${CFG_PATH}/makefile.cfg # 后续原有代码保持不变 INPUT_DIR=${PROG_INPUT_DIR}/input MANIFEST_FILE = ${MANIFEST_DIR}/manifest.xml $(shell mkdir -p ${INPUT_DIR}) Some_Target: . . . . Target:该方案修改后,不管从任意目录调用该makefile,都能正确定位到同目录下的cfg_path文件夹,适合需要对外提供通用makefile的场景。
方案3(临时调用场景适用):调用时显式传入CFG_PATH的绝对路径,命令修改为:
${MAKE} Target -f ${makefile_location}/makefile CFG_PATH=${makefile_location}/cfg_path该方案不需要修改原makefile,仅适合临时调用、不方便修改原文件的场景。
内容的提问来源于stack exchange,提问作者Abdullah Shakir
相关产品推荐
相关产品推荐

