如何让makefile运行所有命令,而不考虑目标或依赖项

如何让makefile运行所有命令,而不考虑目标或依赖项,makefile,bioinformatics,fastq,Makefile,Bioinformatics,Fastq,我正在写一个GNUmakefile来创建一个工作流来分析一些生物序列数据。这些数据以一种称为fastq的格式出现,然后经过许多清理和分析工具。我附上了我目前写的东西,从清洁前的质量控制到清洁后的质量控制。我的问题是,我不确定如何运行“fastqc”命令,因为它的目标不是工作流中任何其他步骤的依赖项 %_sts_fastqc.html %_sts_fastqc.zip: %_sts.fastq # perform quality control after cleaning reads

我正在写一个GNUmakefile来创建一个工作流来分析一些生物序列数据。这些数据以一种称为fastq的格式出现,然后经过许多清理和分析工具。我附上了我目前写的东西,从清洁前的质量控制到清洁后的质量控制。我的问题是,我不确定如何运行“fastqc”命令,因为它的目标不是工作流中任何其他步骤的依赖项

 %_sts_fastqc.html %_sts_fastqc.zip: %_sts.fastq
    # perform quality control after cleaning reads
    fastqc $^

%_sts.fastq: %_st.fastq
    # trim reads based on quality
    sickle se -f $^ -t illumina -o $@

%_st.fastq: %_s.fastq
    # remove contaminated reads
    tagdust -s adapters.fa $^

%_s.fastq: %.fastq
    # trim adapters
    scythe -a <adapters.fa> -o $@ $^

%_fastqc.html %_fastqc.zip: %.fastq
    # perform quality control before cleaning reads
    fastqc $^

%.fastq: %.sra
    # convert .fastq to .sra
    fastq-dump $^
%\u sts\u fastqc.html%\u sts\u fastqc.zip:%\u sts.fastq
#清洁后进行质量控制
fastqc$^
%_st.fastq:%\U st.fastq
#根据质量调整读数
镰刀se-f$^-t illumina-o$@
%_st.fastq:%\U.fastq
#清除受污染的读数
tagdust-s adapters.fa$^
%_s、 fastq:%。fastq
#配平接头
镰刀-a-o$@$^
%_fastqc.html%\u fastqc.zip:%.fastq
#清洁前进行质量控制
fastqc$^
%.fastq:%的sra
#将.fastq转换为.sra
快速转储$^

我不使用模式,而是使用“定义”:

 # 'all' is not a file 
.PHONY: all 
# a list of 4 samples
SAMPLES=S1 S2 S3 S4

#define a macro named analyzefastq. It takes one argument $(1). we need to protect the '$' for later expension using $(eval)
define analyzefastq 
# create a .st.fastq from fastq for file $(1)
$(1).st.fastq  : $(1).fastq
    tagdust -s adapters.fa $$^
# create a .fastq from seq for file $(1)
$(1).fastq : $(1).sra
    fastq-dump $$^

endef

#all : final target  dependency is all samples with a suffix '.st.fastq'
all: $(addsuffix ${S}.st.fastq, ${SAMPLES} )

## loop over each sample , name of variable is 'S' call and eval the previous macro, using 'S'=sample for the argument
$(foreach S,${SAMPLES},$(eval $(call analyzefastq,$(S))) )
我还使用我的工具jsvelocity为NGS生成大型Makefile:


我相信在Makefile的开头添加这些行可以满足您的要求:

SOURCES:=$(wildcard *.sra)
TARGETS:=$(SOURCES:.sra=_fastqc.html) $(SOURCES:.sra=_fastqc.zip)\
     $(SOURCES:.sra=_sts_fastqc.html) $(SOURCES:.sra=_sts_fastqc.zip)

.PHONY: all
all: $(TARGETS)
这样做的目的是从文件系统中获取所有
.sra
文件,并通过使用生成目标所需的任何字符串替换扩展名来构建目标列表。(请注意,由同一命令生成的
html
zip
目标我可以有一个或另一个,但我决定将两者都放在一起,以防规则发生变化,并且
hmtl
zip
目标被单独生成。)然后它设置虚假的
all
目标来构建所有计算的目标。这是一个Makefile,我在你的Makefile中做了修改,在所有地方添加了
@echo
,我用它来检查一切是否正常,而不必运行Makefile中的实际命令。您可以复制并粘贴到一个文件中,首先检查一切是否正常,然后再使用上面的行修改您自己的Makefile。这是:

SOURCES:=$(wildcard *.sra)
TARGETS:=$(SOURCES:.sra=_fastqc.html) $(SOURCES:.sra=_fastqc.zip)\
     $(SOURCES:.sra=_sts_fastqc.html) $(SOURCES:.sra=_sts_fastqc.zip)

.PHONY: all
all: $(TARGETS)

%_sts_fastqc.html %_sts_fastqc.zip: %_sts.fastq
# perform quality control after cleaning reads
    @echo fastqc $^

%_sts.fastq: %_st.fastq
# trim reads based on quality
    @echo sickle se -f $^ -t illumina -o $@

%_st.fastq: %_s.fastq
# remove contaminated reads
    @echo tagdust -s adapters.fa $^

%_s.fastq: %.fastq
# trim adapters
    @echo 'scythe -a <adapters.fa> -o $@ $^'

%_fastqc.html %_fastqc.zip: %.fastq
# perform quality control before cleaning reads
    @echo fastqc $^

%.fastq: %.sra
# convert .fastq to .sra
    @echo fastq-dump $^
SOURCES:=$(通配符*.sra)
目标:=$(源代码:.sra=\u fastqc.html)$(源代码:.sra=\u fastqc.zip)\
$(来源:.sra=\u sts\u fastqc.html)$(来源:.sra=\u sts\u fastqc.zip)
冒牌货:全部
全部:$(目标)
%_sts\u fastqc.html%\u sts\u fastqc.zip:%\u sts.fastq
#清洁后进行质量控制
@echo fastqc$^
%_st.fastq:%\U st.fastq
#根据质量调整读数
@回声镰刀se-f$^-t illumina-o$@
%_st.fastq:%\U.fastq
#清除受污染的读数
@echo tagdust-s adapters.fa$^
%_s、 fastq:%。fastq
#配平接头
@回声“镰刀-a-o$@$^”
%_fastqc.html%\u fastqc.zip:%.fastq
#清洁前进行质量控制
@echo fastqc$^
%.fastq:%的sra
#将.fastq转换为.sra
@回波快速转储$^

我在这里通过运行
touch a.sra b.sra
然后运行
make
来测试它。它对这两个文件都运行了命令。

您能否对代码进行注释,以便我了解每一行的功能?我刚刚开始学习如何在工作流中使用(主要受影响)。谢谢您的更新评论。如果我理解正确,我的质量控制命令应该位于与analyzefastq不同的宏中,因为在该宏中它们仍然遵循模式规则?您可以将所有特定于示例的方法放在同一个宏中(此处为“analyzefastq”)。模式是复杂的,因为类似于
%\u fastqc.html%\u fastqc.zip:%.fastq
的命令将被调用两次。一个用于*.html,另一个用于*.zip。请参见@Pierre您误解了
%\u fastqc.html%\u fastqc.zip:%.fastq
:模式规则实际上是获取输出多个目标的单个命令的唯一方法。对于非模式规则,您的语句是正确的。见@EricMelski,我明白了。谢谢我听从了你的建议,一切都很顺利。另外,我使用以下命令运行makefile:'nohupmake-f mymakefile.GNUmakefile-j 7&'。这会将所有文件的输出转储到nohup文件中,这些文件通常会进入标准输出,不幸的是,使用的一些程序不报告它们处理的文件,只报告结果,因此我无法跟踪哪个.fastq文件的统计信息。有什么办法纠正这个问题吗?