首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对所有规则执行一次makefile

对所有规则执行一次makefile
EN

Stack Overflow用户
提问于 2017-05-22 20:49:07
回答 1查看 899关注 0票数 2

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

代码语言:javascript
复制
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次让-f生成文件来执行所有规则。如何改进这个脚本?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-22 21:33:38

如果我正确理解,makefile就是将一个目录中的vcf文件压缩到第二个目录中的gz文件中,然后使用这些gz文件在第三个目录中构建vcf文件(根据需要构建目录),而最终的vcf文件才是真正的目标。

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

代码语言:javascript
复制
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来确定要构建哪些中间产品:

代码语言:javascript
复制
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"' $<  > $@
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44121927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档