我需要编写一个简单的makefile来启动程序。该程序需要两个输入参数和一个依赖于输入文件的输出 我在RAW /目录上有所有输入。该文件的基本名称相同,但我需要两个文件 R1 和 R2 。
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 " $" $@ $(OUTDIR): mkdir -p $(OUTDIR) clean:: $(RM) -rf $(OUTDIR)
像这样执行命令的简单方法是什么
`tools A_R1_001.fastq.gz -b "A_R2_001.fastq.gz" > FINAL/A`
那么如何结合这个patsubst?
答案 0 :(得分:1)
此:
$(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
但适用于所有输入文件。所以我们写了一个使用pattern rule的automatic variables:
FINAL/%: RAW/%_R1_001.fastq.gz $(OUTDIR)
tools $*_R1_001.fastq.gz -b "$*_R2_001.fastq.gz" > $@
然后我们简化all
规则:
all: $(OUTKAL)
我们已经完成了。