如何在Makefile中仅导入其他Makefile的特定目标?
问题描述
假设存在两个相邻目录A和B:
A目录下有makefile_aB目录下有makefile_b
makefile_b会执行预处理操作,其输出供makefile_a的目标使用,因此需要让makefile_a的某些目标依赖makefile_b的特定目标。
常规做法是在makefile_a中添加include ../B/makefile_b,但这会导入makefile_b的所有目标,污染makefile_a的命名空间,甚至引发同名目标冲突。因此仅希望导入所需的单个目标,而非全部。
曾考虑在B目录创建makefile_b_export供双方引用,但认为这属于临时方案,还可能存在导入循环等问题。请问使用make是否有标准处理方式?最简洁的解决方案是什么?
解决方案
1. 使用make -C调用子目录目标(最简洁标准方案)
这是GNU Make处理跨目录依赖的标准方式,完全隔离两个Makefile的命名空间,不会出现冲突。在makefile_a中直接通过-C选项切换到B目录执行指定目标:
# 直接在目标中调用 target_in_a: $(MAKE) -C ../B specific_target_in_b # 这里写target_in_a的后续处理逻辑 # 或者声明伪目标作为依赖,更符合Makefile的依赖规则 .PHONY: specific_target_in_b specific_target_in_b: $(MAKE) -C ../B $@ target_in_a: specific_target_in_b # 这里写target_in_a的处理逻辑
2. 在makefile_b中通过变量控制目标导出
如果倾向于用include的方式,可在makefile_b中添加条件判断,仅在指定变量存在时导出目标,无需额外创建文件:
# makefile_b 中的修改 ifdef EXPORT_SPECIFIC_TARGET specific_target_in_b: # 这里写该目标的预处理逻辑 else # 这里保留原来的所有其他目标定义 endif
然后在makefile_a中导入时定义变量,只导入需要的目标:
# makefile_a 中的配置 EXPORT_SPECIFIC_TARGET := 1 include ../B/makefile_b target_in_a: specific_target_in_b # 后续处理逻辑
3. 拆分makefile_b为公共部分和私有部分
如果makefile_b的结构允许,可将需要导出的目标单独放在一个小的Makefile(比如B/makefile_b_common)中,makefile_b和makefile_a都include这个公共文件。这种方式逻辑清晰,避免导入循环的关键是确保公共文件只包含共享目标和变量,不依赖私有部分:
# B/makefile_b_common specific_target_in_b: # 预处理逻辑
# B/makefile_b include makefile_b_common # 其他私有目标定义
# A/makefile_a include ../B/makefile_b_common target_in_a: specific_target_in_b # 处理逻辑
内容的提问来源于stack exchange,提问作者mherzl
相关产品推荐
相关产品推荐

