对所有规则执行一次makefile运行

对所有规则执行一次makefile运行,makefile,gnu-make,bioinformatics,vcf-variant-call-format,Makefile,Gnu Make,Bioinformatics,Vcf Variant Call Format,我已经写了一个makefile来准备一些文件。我创建原始目录,然后使用文件夹中的文件启动其他规则 RDIR=. RFILES:=$(wildcard $(RDIR)/*.vcf) OUTDIR=ORIGINAL OUTFILES=$(patsubst %.vcf,$(OUTDIR)/%.gz,$(RFILES)) BCFTOOLS=bcftools OUTSOMATIC=SOMATIC OUTVARDICT=$(patsubst $(OUTDIR)/%vardict.gz,$(OUTSOMA

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

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)
RDIR=。
R文件:=$(通配符$(RDIR)/*.vcf)
OUTDIR=原件
OUTFILES=$(patsubst%.vcf,$(OUTDIR)/%.gz,$(RFILES))
BCFTOOLS=BCFTOOLS
外体=体
OUTVARDICT=$(patsubst)
$(OUTDIR)/%vardict.gz,$(OUTSOMATIC)/%social.vcf,$(通配符)
$(OUTDIR)/*vardict.gz)
OUTMUTEC2=$(patsubst
$(OUTDIR)/%mutect2\u all.gz,$(OUTSOMATIC)/%mutect2.social.vcf,$(通配符)
$(OUTDIR)/*mutect2_all.gz))
OUTVARSCAN2=$(patsubst)
$(OUTDIR)/%varscan.gz,$(OUTSOMATIC)/%varscan2.social.vcf,$(通配符)
$(OUTDIR)/*varscan.gz)
冒牌货:全部
全部:$(OUTDIR)$(OUTFILES)$(OUTSOMATIC)$(OUTVARDICT)$(OUTMUTEC2)
$(OUTVARSCAN2)
$(OUTDIR)/%.gz:%.vcf
bgzip-c$<>$@
$(OUTDIR):
测试-d$@| mkdir$@
$(超体):
测试-d$@| mkdir$@
$(OUTSOMATIC)/%.social.vcf:$(OUTDIR)/%vardict.gz
$(BCFTOOLS)视图-f PASS-i'INFO/STATUS~“*”体细胞“$<>$@
$(OUTSOMATIC)/%mutect2.somatic.vcf:$(OUTDIR)/%mutect2_all.gz
$(BCFTOOLS)视图-f通行证$<>$@
$(OUTSOMATIC)/%varscan2.somatic.vcf:$(OUTDIR)/%varscan.gz
$(BCFTOOLS)视图-f PASS-i'SS=“2”$<>$@
清洁:
rm-rf$(OUTDIR)
rm-rf$(OUTSOMATIC)
我需要启动3次make-f Makefile来执行所有规则。怎么 你能改进剧本吗

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

如果我理解正确,您的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"' $<  > $@
all:$(OUTVARDICT)$(OUTMUTEC2)$(OUTVARSCAN2)
$(OUTDIR)/%.gz:%.vcf$(OUTDIR)
bgzip-c$<>$@
$(OUTDIR):
测试-d$@| mkdir$@
$(超体):
测试-d$@| mkdir$@
$(OUTSOMATIC)/%.social.vcf:$(OUTDIR)/%vardict.gz$(OUTSOMATIC)
$(BCFTOOLS)视图-f PASS-i'INFO/STATUS~“*”体细胞“$<>$@
$(OUTSOMATIC)/%mutect2.somatic.vcf:$(OUTDIR)/%mutect2_all.gz$(OUTSOMATIC)
$(BCFTOOLS)视图-f通行证$<>$@
$(OUTSOMATIC)/%varscan2.somatic.vcf:$(OUTDIR)/%varscan.gz$(OUTSOMATIC)
$(BCFTOOLS)视图-f PASS-i'SS=“2”$<>$@

我无法重现新错误;当我使用
415_tumor…verdict.vcf
运行时,它一次生成
体细胞//415_tumor…体细胞.vcf
。我注意到,在您的新输出中,最后一个命令(
bcftools…
)没有提到输入文件或输出文件。并且您的新makefile构建了
social/
,但没有在其中构建vcf文件。你能把
$(信息列表是$(OUTVARDICT))
放在你的makefile中(就在
all:
规则的上方)并告诉我输出中出现了什么吗?谢谢你的帮助和耐心!!如果我像你在这里看到的那样插入代码[现在似乎运行所有..那是什么意思?[@user3354898:那些页面已经从pastebin中删除了(这是我们通常不喜欢此类链接的一个很好的例子)。你能告诉我输出行“list is…”?很抱歉!!
列表是Social//415\u tumor\u 416\u normal\u merge.vardict.Social.vcf
,我可以在这里插入所有脚本以显示给您。在评论中?实际上,您可以再试一次pastebin吗?这可能是最好的方法。如果是这样,请给我您正在使用的完整makefile,然后运行
make clean
,然后运行
make
,一个I’我会把两者的全部输出都给我。