递归调用make编译库时通过外部makefile设置多变量问题求助
问题根因
- 主Makefile中
include main_setup.mk和VER := $(shell getVersion)两行开头有多余缩进,Makefile 的顶层配置语句(变量赋值、include指令等)不允许缩进,缩进内容会被识别为某条目标规则的命令片段,只有对应目标被执行时才会处理,因此你写的include实际上根本没有在解析阶段加载配置文件,所有配置的PATH、导出变量都不会生效,导致执行$(shell getVersion)时找不到命令。 - 主Makefile存在多处语法错误:
- 重复定义
import_a目标,原本build_b、build_c对应的规则目标被错误写成了import_a - 变量引用格式错误,
$aDir需要写成$(aDir)才会被正确识别为变量 --output_sync=target是GNU Make 4.4+才支持的参数,低版本Make运行会报错,需要确认版本兼容
- 重复定义
修复方案
第一步:修正主Makefile的缩进和语法错误:
# 顶层配置语句去掉所有开头缩进 include main_setup.mk VER := $(shell getVersion) main_setup: # 规则内的命令用Tab缩进即可 //setupsteps release: $(MAKE) main_setup $(MAKE) -j8 --output-sync=target build_main build_main: import_a import_b import_c import_a: build_a //import_steps import_b: build_b //import_steps import_c: build_c //import_steps build_a: $(MAKE) -C $(aDir) -j4 build build_b: $(MAKE) -C $(bDir) -j4 build build_c: $(MAKE) -C $(cDir) -j4 build
第二步:可以同步优化配置文件main_setup.mk的赋值逻辑,提升灵活性:
plat_prefix = /main buildroot = $(plat_prefix)/submain/another # 优先用用户传入的LOCAL_BUILD_ROOT,没有则用默认值 BUILD_ROOT ?= $(buildroot) export BUILD_ROOT ifneq ($(strip $(JAVA_PATH)),) export PATH := $(JAVA_PATH):$(PATH) endif export VAR1 = 1 export VAR2 = 2 export VAR3 = 3 export VAR4 = 4 export PATH := /var/main/bin:$(VAR1)/tools/bin:$(VAR2)/tools/bin:$(VAR3)/tools/bin:$(PATH)
调试方法
如果需要验证变量是否正常生效,可以在主Makefile中添加debug目标,直接打印所有变量值:
debug: @echo PATH: $(PATH) @echo BUILD_ROOT: $(BUILD_ROOT) @echo VER: $(VER)
执行make debug即可查看变量实际取值,快速排查配置加载问题。
内容的提问来源于stack exchange,提问作者apurva
相关产品推荐
相关产品推荐

