如何将Makefile模式匹配限制为选项列表

时间:2019-06-03 21:18:10

标签: makefile

我想在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规则。

当前结果:我不知道如何编写此规则。

1 个答案:

答案 0 :(得分:1)

此:

${targets} %.intermediate: %.original

无效,因为模式规则中的所有目标都必须包含模式。

此:

${targets}: %.final: %.intermediate

static pattern rule,这就是您想要的,但是静态模式规则中的每个目标都必须与目标匹配。所以你想要这个:

$(targets:%=%.final) : %.final : %.intermediate