2017-05-05 55 views
0

我需要编写一个简单的makefile来启动程序。该程序需要两个输入参数和一个输出,这取决于输入文件 我拥有RAW /目录上的所有输入。该文件的基本名称是相同的,但我需要两个文件R1R2gnu makefile如何从patsubst管理3个参数

 

    RDIR=RAW 
    OUTDIR=FINAL 
    RFILES:=$(wildcard $(RDIR)/*_R1_001.fastq.gz) 

    OUTFILE=$(patsubst %_R1_001.fastq.gz,%_R2_001.fastq.gz,$(RFILES)) 
    OUTKAL=$(patsubst $(RDIR)/%_R1_001.fastq.gz,$(OUTDIR)/%,$(RFILES)) 
    .PHONY: clean all 

    all: $(OUTFILE) $(RFILES) $(OUTDIR) $(OUTKAL) 
    $(OUTFILE): $(RFILES) 
     -echo $ FINAL/A 
     -echo "tools -i " $" [email protected] 



    $(OUTDIR): 
     mkdir -p $(OUTDIR) 


    clean:: 
     $(RM) -rf $(OUTDIR) 

有什么简单的方法来做到这样

 
`tools A_R1_001.fastq.gz -b "A_R2_001.fastq.gz" > FINAL/A` 

因此,如何能结合这个patsubst一个COMAND?

回答

0

此:

$(OUTFILE): $(RFILES) 
    ... 

是错误的建设。它使得全部输入文件的先决条件为每个输出文件。此外,您似乎打算构建FINAL/A,但此规则告诉Make其目的是构建RAW/A_R2_001.fastq.gz,这会导致问题。

我们需要的是这样的:

FINAL/A: RAW/A_R1_001.fastq.gz $(OUTDIR) 
    tools A_R1_001.fastq.gz -b "A_R2_001.fastq.gz" > FINAL/A 

但对于所有的输入文件。因此,我们写它采用automatic variables一个pattern rule

FINAL/%: RAW/%_R1_001.fastq.gz $(OUTDIR) 
    tools $*_R1_001.fastq.gz -b "$*_R2_001.fastq.gz" > [email protected] 

然后我们简化all规则:

all: $(OUTKAL) 

,我们就大功告成了。

+0

非常感谢! –