在Makefile目标中使用标志
假设我有这样一个Makefile:在Makefile目标中使用标志,makefile,Makefile,假设我有这样一个Makefile: (more Makefile code) %_dev.pdf: %.csv # do stuff that %_prod.pdf: %.csv # do stuff MODE?=dev %_$(MODE).pdf: %.csv # do stuff 我喜欢有一个快速的开发运行和一个较长的prod运行。上面的代码反映了这一点。但是,它会导致冗余代码。所以我想这样做: (more Makefile code) %_dev.pdf
(more Makefile code)
%_dev.pdf: %.csv
# do stuff that
%_prod.pdf: %.csv
# do stuff
MODE?=dev
%_$(MODE).pdf: %.csv
# do stuff
我喜欢有一个快速的开发运行和一个较长的prod运行。上面的代码反映了这一点。但是,它会导致冗余代码。所以我想这样做:
(more Makefile code)
%_dev.pdf: %.csv
# do stuff that
%_prod.pdf: %.csv
# do stuff
MODE?=dev
%_$(MODE).pdf: %.csv
# do stuff
这有效吗?我似乎在混合不同的概念,可能会遇到问题。实现某种切换目标的首选方法是什么?您的代码是有效的
您不需要处理后缀,只需将其构建到另一个目录中即可:
MODE := dev # Immediate assignment, make MODE=prod overrides it.
build_dir := ${MODE}
${build_dir}/%.pdf : %.csv | ${build_dir}
# commands
${build_dir} :
mkdir -p $@
您可以添加一个虚假目标,让它处理公共部分。这将消除重复代码问题是“有多冗余?”。在编写其他语言时,应用通常使用的关注点分离技术:是否有一个公共子进程可以单独作为目标?如果没有得到处理的文件,可能
.PHONY
可以充当中介功能的目标?如果代码真的很复杂,那么对于大型make
程序来说,a可能是一个可行的解决方案,您可能需要调用一个助手库来克服一些复杂性