2015-08-26 20 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