makefile运行一次执行所有规则

时间:2017-05-22 20:49:07

标签: makefile gnu-make bioinformatics

我已经编写了一个准备一些文件的makefile。我创建了ORIGINAL目录,然后我使用文件夹中的文件启动其他规则

RDIR=.
RFILES:=$(wildcard $(RDIR)/*.vcf)
OUTDIR=ORIGINAL
OUTFILES=$(patsubst %.vcf,$(OUTDIR)/%.gz,$(RFILES))
BCFTOOLS=bcftools 
OUTSOMATIC=SOMATIC
OUTVARDICT=$(patsubst 
$(OUTDIR)/%vardict.gz,$(OUTSOMATIC)/%.somatic.vcf,$(wildcard 
$(OUTDIR)/*vardict.gz))
OUTMUTEC2=$(patsubst 
$(OUTDIR)/%mutect2_all.gz,$(OUTSOMATIC)/%mutect2.somatic.vcf,$(wildcard 
$(OUTDIR)/*mutect2_all.gz))

OUTVARSCAN2=$(patsubst 
$(OUTDIR)/%varscan.gz,$(OUTSOMATIC)/%varscan2.somatic.vcf,$(wildcard 
$(OUTDIR)/*varscan.gz))

.PHONY: all

all: $(OUTDIR) $(OUTFILES) $(OUTSOMATIC) $(OUTVARDICT) $(OUTMUTEC2) 
$(OUTVARSCAN2)


$(OUTDIR)/%.gz: %.vcf
    bgzip -c $<  > $@


$(OUTDIR):
    test -d $@ || mkdir $@

$(OUTSOMATIC):
    test -d $@ || mkdir $@



$(OUTSOMATIC)/%.somatic.vcf: $(OUTDIR)/%vardict.gz
    $(BCFTOOLS)  view  -f PASS -i 'INFO/STATUS ~ ".*Somatic"' $<  > $@



$(OUTSOMATIC)/%mutect2.somatic.vcf: $(OUTDIR)/%mutect2_all.gz
    $(BCFTOOLS)  view  -f PASS $<  > $@



$(OUTSOMATIC)/%varscan2.somatic.vcf: $(OUTDIR)/%varscan.gz
    $(BCFTOOLS)  view  -f PASS -i 'SS="2"' $<  > $@




clean:
    rm -rf $(OUTDIR)
    rm -rf $(OUTSOMATIC)

我需要启动3次make -f Makefile来执行所有规则。怎么样 可以改进那个脚本吗?

正确的方法是什么? 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你的makefile是一个目录下的zip vcf文件到第二个目录中的gz文件,然后使用那些gz文​​件在第三个目录中构建vcf文件(根据需要构建目录),那些最终的vcf文件是真正的目标。

如果修改变量赋值以从计划的gz文件中导出目标名称,而不是已经存在的gz文件,则可以一次完成:

OUTVARDICT=$(patsubst $(OUTDIR)/%vardict.gz,$(OUTSOMATIC)/%.somatic.vcf,$(filter $(OUTDIR)/%vardict.gz, $(OUTFILES)))

OUTMUTEC2= $(patsubst $(OUTDIR)/%mutect2_all.gz, $(OUTSOMATIC)/%mutect2.somatic.vcf, $(filter $(OUTDIR)/%mutect2_all.gz, $(OUTFILES)))

OUTVARSCAN2 = $(patsubst $(OUTDIR)/%varscan.gz,$(OUTSOMATIC)/%varscan2.somatic.vcf, $(filter $(OUTDIR)/%varscan.gz, $(OUTFILES)))

并修改规则以允许Make确定要构建的中间体:

all: $(OUTVARDICT) $(OUTMUTEC2) $(OUTVARSCAN2)

$(OUTDIR)/%.gz: %.vcf $(OUTDIR)
    bgzip -c $<  > $@

$(OUTDIR):
    test -d $@ || mkdir $@

$(OUTSOMATIC):
    test -d $@ || mkdir $@

$(OUTSOMATIC)/%.somatic.vcf: $(OUTDIR)/%vardict.gz $(OUTSOMATIC)
    $(BCFTOOLS)  view  -f PASS -i 'INFO/STATUS ~ ".*Somatic"' $<  > $@

$(OUTSOMATIC)/%mutect2.somatic.vcf: $(OUTDIR)/%mutect2_all.gz $(OUTSOMATIC)
    $(BCFTOOLS)  view  -f PASS $<  > $@

$(OUTSOMATIC)/%varscan2.somatic.vcf: $(OUTDIR)/%varscan.gz $(OUTSOMATIC)
    $(BCFTOOLS)  view  -f PASS -i 'SS="2"' $<  > $@