首页 > 解决方案 > 如何将 Makefile 模式匹配限制为选项列表

问题描述

我想%.final: %.intermediate在makefile中使用隐式规则(类型),但仅适用于某些文件(仅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

预期结果:在所有 CHIP_TARGETS 上执行 ${BAM_COVERAGE},并适当执行 $CHIP_BLANK_ACCESSION 的 CHIP_REFERENCE 规则。

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

标签: makefile

解决方案


这:

${targets} %.intermediate: %.original

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

这:

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

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

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

推荐阅读