gnu makefile如何从patsubst管理3个参数

时间:2017-05-05 15:29:22

标签: makefile gnu-make

我需要编写一个简单的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?

1 个答案:

答案 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 ruleautomatic variables

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

然后我们简化all规则:

all: $(OUTKAL)

我们已经完成了。