2015-08-26 22 views
1

我有一个从生物数据库下载数据的Makefile。给定一个项目编号,它应该首先下载一个文件,其中包含有关该项目的所有运行信息,然后从信息中提取登录号,然后并行下载与这些登录号相关联的FASTQ文件。我的问题是我无法让变量FASTQ被延迟到run.txt和sra.txt被下载之后。我尝试了仅订购前提条件和.SECONDEXPANSION的组合,但仍无法使其工作。它甚至有可能吗?推迟变量赋值,直到在Makefile中执行文件或规则

# Project 
PROJECT := PRJNA257197 

# Download 
.SECONDEXPANSION: 
FASTQ = $(patsubst %, %.fastq, $(shell cat sra.txt)) 
download: $$(FASTQ) | run.txt sra.txt 

%.fastq: sra.txt 
    # Download FASTQ files 
    fastq-dump $* 

sra.txt: run.txt 
    # Extract SRA accession numbers 
    cat $^ | cut -f 1 -d ',' | grep SRR | tr '\n' ' ' > [email protected] 

run.txt: 
    # Download run information 
    esearch -db sra -query $(PROJECT) | efetch -format runinfo > [email protected] 
+0

您没有在该代码段中启用辅助扩展功能。你也不要在任何地方使用'download'目标。你能提供一个完整而准确的makefile来代表你的尝试吗?这就是说,你不能够知道目标,直到他们的先决条件被处理之后才能被确定。你必须以另一种方式工作。您需要获取prereq,然后您可以处理确定依赖于它的目标(生成的包含makefile在此处可能很有用)。 –

+0

@EtanReisner我的道歉,我添加了二次扩展。下载目标是makefile中的第一个目标,所以默认情况下它会在运行make时执行。 – jma1991

回答

1

做你想做的,你想要更多的东西像这样(评论在线)什么:

# Project 
PROJECT := PRJNA257197 

# Include the fastqs.mk makefile. 
include fastqs.mk 

# Default target is all the fastq files. 
all: $(FASTQS) 

%.fastq: sra.txt 
    # Download FASTQ files 
    fastq-dump $* 

# Create the fastqs.mk file from sra.txt. 
fastqs.mk: sra.txt 
    sed 's.*/FASTQS+=&.fastq/' $< > [email protected] 

sra.txt: run.txt 
    # Extract SRA accession numbers 
    cat $^ | cut -f 1 -d ',' | grep SRR | tr '\n' ' ' > [email protected] 

run.txt: 
    # Download run information 
    esearch -db sra -query $(PROJECT) | efetch -format runinfo > [email protected] 

假设每个.fastq文件有一个匹配的裸文件(即foo.fastq - >foo),那么你可能想这作为模式目标。

%.fastq: % sra.txt 

这里的魔法就是包含makefile。具体来说,make很聪明,可以注意到何时需要构建一个包含的makefile并在完成后重新启动处理。有关更多详细信息,请参见手册中的How Makefiles Are Remade