lundi 3 juin 2019

How to limit Makefile pattern matching to a list of options

I would like to use an implicit rule (of the %.final: %.intermediate type) in a makefile, but only for certain files (only a.final and b.final, but not x.final)

I've tried to use

targets=a b c
${targets} %.intermediate: %.original
    process1 $< > $@
${targets}: %.final: %.intermediate
    process2 $< > $@
all: ${targets}

but I'm just not making make happy. I'm not sure exactly what these implicit rules are doing, and if targets needs to include '.final', or how to really make it come together. If I do

a.intermediate: a.original
    process1 a.original > a.intermediate
a.final: a.intermediate
    process2 a.intermediate > a.final
#and continue for b, c, etc. 

Then things are just fine and dandy.

Here's the general idea. It's not in good form because I'm not used to writing makefiles with pattern substitution and so forth.

#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

Expected result: ${BAM_COVERAGE} is executed on all of the CHIP_TARGETS, with appropriate execution of CHIP_REFERENCE rules for the $CHIP_BLANK_ACCESSION.

Current results: I don't know how to write this rule.

Aucun commentaire:

Enregistrer un commentaire