如何在Makefile中移除自动变量$^的首个依赖并传递剩余部分作为参数
解决方案:移除$^中的首个依赖传递参数
当然可以实现这个需求!Makefile提供了内置函数帮你轻松处理依赖列表,不用再手动重复编写那些CSV文件路径。下面给你两种实用的方法:
方法1:使用wordlist提取从第2个开始的所有依赖
wordlist函数可以按位置范围提取列表中的元素,结合words函数获取依赖总数,就能精准跳过第一个依赖:
%/collapsed_flow_profile.png: \ code/piv/plot_collapsed_flow_profiles.R \ %/experiment2/averaged_flow_profile.csv \ %/experiment3/averaged_flow_profile.csv \ %/experiment4/averaged_flow_profile.csv \ %/experiment6/averaged_flow_profile.csv \ %/experiment7/averaged_flow_profile.csv code/piv/plot_collapsed_flow_profiles.R \ $@ \ $(wordlist 2,$(words $^),$^)
$(words $^):返回$^中所有依赖的总数量$(wordlist 2, N, $^):从第2个元素(Makefile列表索引从1开始)到第N个元素,提取所有内容- 另外把
$*/collapsed_flow_profile.png换成了$@,这是Makefile的自动变量,代表当前规则的目标文件,写法更简洁规范。
方法2:使用filter-out剔除首个依赖
filter-out函数可以从列表中移除指定的元素,结合$<(代表第一个依赖),就能直接去掉R脚本这个依赖:
%/collapsed_flow_profile.png: \ code/piv/plot_collapsed_flow_profiles.R \ %/experiment2/averaged_flow_profile.csv \ %/experiment3/averaged_flow_profile.csv \ %/experiment4/averaged_flow_profile.csv \ %/experiment6/averaged_flow_profile.csv \ %/experiment7/averaged_flow_profile.csv code/piv/plot_collapsed_flow_profiles.R \ $@ \ $(filter-out $<,$^)
$<:自动指向规则的第一个依赖(也就是你的R脚本)$(filter-out $<,$^):从所有依赖$^中移除和$<匹配的元素,剩下的就是所有CSV文件路径
这两种方法在你的场景下效果完全一致,都能帮你避免手动重复维护依赖参数,以后新增或修改CSV依赖时,只需要更新规则的依赖列表即可,配方部分不用改动,让Makefile更易维护。
内容的提问来源于stack exchange,提问作者Our
相关产品推荐
相关产品推荐

