GNU Make:如何在依赖中使用目标文件名实现文件复制
解决Makefile指定文件跨目录复制的自动变量展开问题
问题描述
需要将一批文件从固定源目录复制到不同目标目录,编写的Makefile代码无法正常运行:
COPY_FILES += TargetDir1/MySource.c COPY_FILES += TargetDir2/MyHeader.h $(COPY_FILES): SourceDir/$(notdir $@) @cp $< $@
问题根源在于自动变量$@无法在依赖列表中展开,导致依赖解析错误。要求规则仅作用于指定的目标文件,不适用通用的%通配符规则。
解决方案
方法1:使用静态模式规则
静态模式规则可以精准匹配指定的目标集合,同时正确解析依赖中的文件名:
COPY_FILES += TargetDir1/MySource.c COPY_FILES += TargetDir2/MyHeader.h # 静态模式规则:为每个目标生成对应依赖 $(COPY_FILES): %: SourceDir/$(notdir %) @cp $< $@
- 这里的
%会匹配COPY_FILES中的每个目标路径; $(notdir %)提取目标的文件名,拼接成源目录下的完整依赖路径;- 自动变量
$<(依赖文件)和$@(目标文件)能正常展开,完成复制操作。
方法2:使用foreach+eval动态生成规则
如果需要更灵活的逻辑,可以通过遍历目标列表,为每个文件单独生成规则:
COPY_FILES += TargetDir1/MySource.c COPY_FILES += TargetDir2/MyHeader.h # 遍历所有目标,动态生成复制规则 $(foreach file,$(COPY_FILES),$(eval $(file): SourceDir/$(notdir $(file)) ; @cp $$< $$@))
foreach遍历COPY_FILES中的每个目标;eval负责生成实际的规则,注意变量前加$$转义,避免在foreach阶段被提前替换;- 每个目标都会生成独立的规则,精准对应源文件。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

