我想在Makefile中使用(%.final: %.intermediate
类型的隐式规则,但仅适用于某些文件(仅a.final和b.final,而不是x.final)
我尝试使用
targets=a b c
${targets} %.intermediate: %.original
process1 $< > $@
${targets}: %.final: %.intermediate
process2 $< > $@
all: ${targets}
但我只是不让自己开心。我不确定这些隐式规则到底在做什么,以及目标是否需要包含“ .final”,或者如何真正使它们组合在一起,我不确定。 如果我这样做
a.intermediate: a.original
process1 a.original > a.intermediate
a.final: a.intermediate
process2 a.intermediate > a.final
#and continue for b, c, etc.
然后一切都很好,花花公子。
这是一般想法。它的格式不好,因为我不习惯用模式替换等来编写makefile。
#Reference data
CHIP_WCE_ACCESSION=SRR713343
CHIP_BLANK_ACCESSION=SRR713344
#Experiment data
CHIP_NANOG_ACCESSION=SRR713342
CHIP_SOX2_ACCESSION=SRR713341
CHIP_OCT4_ACCESSION=SRR713340
CHIP_TARGETS=${CHIP_NANOG_ACCESSION} ${CHIP_SOX2_ACCESSION} ${CHIP_OCT4_ACCESSION}
#Note that CHIP_WCE_ACCESSION is *not* processed with these.
CHIP_REFERENCE=${CHIP_BLANK_ACCESSION} ${CHIP_WCE_ACCESSION}
BAM_COVERAGE=bamCoverage --numberOfProcessors 16 --binSize 10
#This is a specific bioinformatics program.
${CHIP_REFERENCE}: %.sort.bam
echo hello > $@ #Not the same way the CHIP_TARGETS are created.
${CHIP_TARGETS}: %.sort.bam
touch $@ #There's actually a long chain of processing, but touch works for the minimal example.
${CHIP_TARGETS}: %.bw: %.sort.bam ${CHIP_BLANK_ACCESSION}.sort.bam
${BAM_COVERAGE} --use-reference ${CHIP_BLANK_ACCESSION}.sort.bam --bam $< -o $@
chip: ${CHIP_NANOG_ACCESSION}.bw ${CHIP_SOX2_ACCESSION}.bw ${CHIP_OCT4_ACCESSION}.bw
预期结果:$ {BAM_COVERAGE}在所有CHIP_TARGETS上执行,并对$ CHIP_BLANK_ACCESSION适当执行CHIP_REFERENCE规则。
当前结果:我不知道如何编写此规则。
答案 0 :(得分:1)
此:
${targets} %.intermediate: %.original
无效,因为模式规则中的所有目标都必须包含模式。
此:
${targets}: %.final: %.intermediate
是static pattern rule,这就是您想要的,但是静态模式规则中的每个目标都必须与目标匹配。所以你想要这个:
$(targets:%=%.final) : %.final : %.intermediate