并行运行makefile时只创建一次目录

时间:2015-01-25 13:08:58

标签: makefile bioinformatics pipeline fastq

我使用make来编写用于生物数据分析的管道。我的项目目录是:

PROJECT
 - DATA
  - SAMPLEA
   - A1.FASTQ A2.FASTQ
  - SAMPLEB
   - B1.FASTQ B2.FASTQ
 - RESULTS
 - SRC
  - makefile

我当前的makefile使用通配符列出DATA目录中所有.FASTQ文件的目录。使用模式规则,每个.FASTQ文件都会经过一系列配方,最终输出文件写入RESULTS目录。相反,我想为每个SAMPLE创建一个目录,其中写入最终输出文件:

PROJECT/RESULTS/SAMPLEA/A1.out
PROJECT/RESULTS/SAMPLEA/A2.out
PROJECT/RESULTS/SAMPLEB/B1.out
PROJECT/RESULTS/SAMPLEB/B2.out

我可以通过让第一个配方创建目录来实现这一点,但是当来自同一个SAMPLE的第二个FASTQ文件也尝试创建目录时,这会引发错误。堆栈溢出上的一些帖子建议在mkdir上使用-p标志来忽略错误,但是当我使用-j标志并行运行makefile时,这显然会导致问题。我想在makefile的开头强制运行一个shell脚本,检查结果目录是否存在,如果不存在则应该创建它们,但是我想尝试使用make来解决这个问题

1 个答案:

答案 0 :(得分:0)

在执行规则之前创建目录。

DATADIR := $(shell cd DATA; find * -type d)

create_results_dir:= $(shell for i in $(DATADIR); \
    do test -d DATA/$$i && mkdir -p RESULTS/$$i; \
    done)

all:
    @echo do something.