【问题标题】:makefile run execute one time for all rulesmakefile run 对所有规则执行一次
【发布时间】:2017-05-22 20:49:07
【问题描述】:

我写了一个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 来执行所有规则。如何 可以改进那个脚本吗?

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

【问题讨论】:

    标签: makefile gnu-make bioinformatics vcf-variant-call-format


    【解决方案1】:

    如果我理解正确,您的 makefile 是将一个目录中的 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"' $<  > $@
    

    【讨论】:

    • 我无法重现新错误;当我使用415_tumor...verdict.vcf 运行时,它会一次性生成SOMATIC/./415_tumor....somatic.vcf。我注意到在您的新输出中,最后一个命令 (bcftools ...) 没有提及输入文件或输出文件。并且您的新 makefile 构建 SOMATIC/ 但没有在其中构建任何 vcf 文件。你能把$(info list is $(OUTVARDICT)) 放在你的makefile 中(就在all: 规则的上方),然后告诉我输出中出现了什么吗?
    • 感谢您的帮助和耐心等待!!如果我插入该代码,如您在此处看到的那样 [pastebin.com/yxqpMRqG] 现在似乎全部运行.. 该命令的含义是什么? [pastebin.com/NZCa4jD6]
    • @user3354898:这些页面已从 pastebin 中删除(这是我们通常不喜欢此类链接的一个很好的例子)。你能告诉我输出行“list is ...”吗?
    • 对不起! list is SOMATIC/./415_tumor_416_normal_merge.vardict.somatic.vcf 我可以在哪里插入所有的脚本给你看..在评论中?
    • 其实可以再试试pastebin吗?在这种情况下,这可能是最好的方法。如果是这样,请给我您正在使用的完整 makefile,然后运行 ​​make clean,然后运行 ​​make,并给我两者的完整输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多