Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在makefile中使用.PHONY目标的模式规则的替代方案?_Makefile_Bioinformatics - Fatal编程技术网

在makefile中使用.PHONY目标的模式规则的替代方案?

在makefile中使用.PHONY目标的模式规则的替代方案?,makefile,bioinformatics,Makefile,Bioinformatics,我正在写一篇分析生物数据的文章。管道有三个不同的部分,第一部分是检查数据的质量,第二部分是清理数据,第三部分是对齐数据。在每个部分完成后,我想在继续下一部分之前手动检查结果。因此,我希望能够使用类似于您如何调用clean的虚假目标来调用每个部分,而不是使用单个模式规则链。例如: make analysis.pipeline quality make analysis.pipeline trim make analysis.pipeline align 这是我当前的makefile: # ana

我正在写一篇分析生物数据的文章。管道有三个不同的部分,第一部分是检查数据的质量,第二部分是清理数据,第三部分是对齐数据。在每个部分完成后,我想在继续下一部分之前手动检查结果。因此,我希望能够使用类似于您如何调用clean的虚假目标来调用每个部分,而不是使用单个模式规则链。例如:

make analysis.pipeline quality
make analysis.pipeline trim
make analysis.pipeline align
这是我当前的makefile:

# analysis pipeline

include analysis.pipeline.config

# align data
all: $(sorted_bam)

$(results)/%.sorted.bam: $(results)/%.bam
    samtools sort $^ $(basename $@)

$(results)/%.bam: $(results)/%.sam
    samtools view -bS $^ > $@

$(results)/%.sam: $(results)/%.adaprm.fastq
    bowtie2 -x $(genome) -U $^ -S $@


# clean data
.PHONY: trim
trim: $(qc_processed) $(trimmed_fastq)

$(results)/%.adaprm_fastqc.html: $(results)/%.adaprm.fastq
    fastqc -o $(@D) $^

$(results)/%.adaprm.fastq: $(data)/%.fastq
    cutadapt -a AACCGGTT $^ > $@


# check data
.PHONY: quality
quality: $(qc_raw)

$(results)/%_fastqc.html: $(data)/%.fastq
    mkdir -p $(@D) && fastqc -o $(@D) $^
makefile被编写为在src目录中运行,该目录与构建目标和依赖项的位置(即数据和结果目录)是分开的。是否可以按照我的意愿调用管道的每个部分,如果我并行运行,是否会出现任何问题,这是避免在虚假目标中使用隐式模式规则的正确方法

更新的makefile


我没有完全遵循makefile,一些变量定义似乎缺失,但make analysis.pipeline质量告诉make运行两个目标。这听起来不像你的意思。在任何情况下,我认为正确的想法是编写makefile,这样它就可以像从上到下链接一样正常使用,然后编写。虚假目标,它依赖于每个阶段作为输出的所有不同文件,这样你就可以在任何需要的阶段跳转到管道中。@EtanReisner是,你所描述的完全符合。我已经用新的makefile更新了我的帖子。我已经通过以下方式对管道进行了一次试运行:1运行而不命名目标->仅使第一个配方运行2运行,同时将质量、修剪或对齐命名为目标->使每个部分的配方运行,包括之前的部分。这似乎有效,因此我认为我已经正确地将您的建议付诸实践,从更新的makefile的外观来看,这似乎正确吗?
# objects = A.fastq B.fastq

.PHONY: quality
quality: A_fastqc.html B_fastqc.html C_fastqc.html

.PHONY: trim
trim: A.trimmed_fastqc.html B.trimmed_fastqc.html

.PHONY: align
align: A.sorted.bam.bai B.sorted.bam.bai

# ALIGN DATA SECTION
%.sorted.bam.bai: %.sorted.bam
    samtools index $^

%.sorted.bam: %.bam
    samtools sort $^ $@

%.bam: %.sam
    samtools view -bS $^ > $@

%.sam: %.trimmed.fastq %.trimmed_fastqc.html
    bowtie2 -x $(genome) -U $< -S $@

# TRIM DATA SECTION
%.trimmed_fastqc.html: %.trimmed.fastq
    fastqc $^

%.trimmed.fastq: %.adaprm.fastq
    seqtk trimfq $^ > $@

%.adaprm.fastq: %.fastq %_fastqc.html
    cutadapt -a AACCGGTT $< > $@

# CHECK QUALITY SECTION
%_fastqc.html: %.fastq
    fastqc $^