GNU Makefile中首个无依赖的target_compile目标未触发问题咨询
问题根源与解决方案
你遇到的问题核心在于Makefile对同名目标的处理规则,以及变量赋值的时机问题,咱们一步步拆解:
1. 同名目标的合并逻辑
Makefile中如果定义了多个同名目标,规则是这样的:
- 所有目标的依赖会被合并到一起
- 但只有最后一个目标定义中的配方会被保留并执行
你写的第一个target_compile目标(仅变量赋值的那个),它的配方直接被第二个同名目标的配方覆盖了,所以执行make target_compile时,第一个目标的内容根本不会被触发。
2. 配方里的变量赋值无效的深层原因
退一步说,就算第一个目标没被覆盖,你写的PROJECT_SIM_OPTS += ...是作为配方行存在的——配方行是在子shell中执行的shell命令,这里的变量赋值是shell层面的临时变量,完全不会影响Makefile本身的变量(Make的变量是在解析阶段处理的,和执行阶段的子shell变量是两个独立的环境)。这也是为什么你加override没用的原因:override是用来修改Make解析阶段的变量定义,和子shell里的赋值完全不相关。
正确的解决方案
要给特定目标追加变量值,你需要用目标特定变量(Target-specific Variable),这是Make 3.81及以上版本支持的特性,写法如下:
# 给target_compile目标追加变量值,这是Make解析阶段处理的,会影响后续配方中的变量引用 target_compile: PROJECT_SIM_OPTS += -LDFLAGS -L${CURRENT_DIR},-lm -load target_compile: copy_shared_object actual_compile_with_sim_opts @echo PROJECT_SIM_OPTS=${PROJECT_SIM_OPTS}
这种写法的好处是:
- 变量赋值直接关联到
target_compile目标,只有在构建该目标时才会生效 - 赋值是在Make的解析阶段完成的,会正确传递到后续的配方和依赖目标中
如果你的Make版本比较旧,不支持目标特定变量,也可以把变量赋值移到目标之前,或者用条件判断来控制变量的追加,但目标特定变量是最简洁的方案。
内容的提问来源于stack exchange,提问作者tulamba
相关产品推荐
相关产品推荐

