在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

假设我有这样一个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: %.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可能是一个可行的解决方案,您可能需要调用一个助手库来克服一些复杂性