2017-05-24 13 views
0

を生成し、私はメイク [[email protected] 415]$ make --version GNU Make 3.81メイクファイル:3入力から1つの出力

私は3ファイルを持つディレクトリSOMATICを持っているのこのバージョンを持っています。私は唯一の出力を作りたいと思う。これは私が書いたものです。このスクリプトでは

`

OUTSOMATIC=SOMATIC 
FINAL=FINAL 
INPUT=$(wildcard $(OUTSOMATIC)/*.vcf) 
OUTSORT2= $(patsubst $(OUTSOMATIC)/%.vcf,$(FINAL)/%somatic.ensemble.gz,$(INPUT)) 
$(info lista $(OUTSORT2)) 
$(info lista $(INPUT)) 
.PHONY: all 
all: $(INPUT) $(OUTSOMATIC) $(OUTSORT2) $(FINAL) 
$(FINAL)/%somatic.ensemble.gz: $(OUTSOMATIC)/%.vcf $(INPUT) 
    ~/jdk1.8.0_121/bin/java -XX:+UseSerialGC -Xms1g -Xmx10g -jar /illumina/software/PROG2/bcbio-variation-recall-0.1.7 ensemble -n 1 $(FINAL)/somatic_ensemble.gz /illumina/software/database/database_2016/hg19_primary.fa $^ 

`

3時間同じファイルを作ります。私は同じ時間に使用する入力リストから1つの出力だけを作成する方法を理解していません。 これを行う最善の方法は何ですか? $(FINAL)/%somatic.ensemble.gzを変更した場合:$(FINAL)/somatic.ensemble.gzに私はこのエラーがあります:

make: *** No rule to make target FINAL/415_merge_mutect2.somaticsomatic.ensemble.gz', needed byすべてこのエラーがあります。停止 `

答えて

1

おそらく、GNU makeマニュアルの入門セクションで、makeの仕組みを説明するセクションを参照してください。

メイクファイルを見てみましょう。まずいくつかの変数を定義します。ファイルSOMATIC/foo.vcfSOMATIC/bar.vcf、およびSOMATIC/baz.vcfがあるとします。次に、作成した変数は、彼らが展開された後、これらの値を持つことになります。今

OUTSOMATIC = SOMATIC 
FINAL = FINAL 
INPUT = SOMATIC/foo.vcf SOMATIC/bar.vcf SOMATIC/baz.vcf 

あなたpatsubstはパターンSOMATIC/%.vcfにマッチし、一部は中%と一致するFINAL/%somatic.ensemble.gz、とのことを置き換えるINPUT内のすべての単語を検索します入力が出力に代入されます。

OUTSORT2 = FINAL/foosomatic.ensemble.gz FINAL/barsomatic.ensemble.gz FINAL/bazsomatic.ensemble.gz 

、あなたがallターゲットを定義したことを認識します。これはmakefileの最初のターゲットなので、これはデフォルトで実行されるターゲットです。拡張した後、それは次のようになります。

だから、
all: SOMATIC/foo.vcf SOMATIC/bar.vcf SOMATIC/baz.vcf SOMATIC FINAL/foosomatic.ensemble.gz FINAL/barsomatic.ensemble.gz FINAL/bazsomatic.ensemble.gz FINAL 

は、それが最新だ確かにall対象のすべての前提条件を構築しようとします。まず、SOMATIC/*.vcfファイルを作成しようとします。それらのファイルはすでに存在しており、makeはそれらを再構築するためのルールを持っていないので、最新であると仮定します。

次に、SOMATICファイルを作成しようとしています。これはディレクトリであり、ビルドするルールもないので、makeは最新のものであると仮定します。

次は、ターゲットFINAL/foosomatic.ensemble.gzをビルドしようとします。作るあなたは1を作成しました、それを構築することができ、ルールを持っているん:

$(FINAL)/%somatic.ensemble.gz: $(OUTSOMATIC)/%.vcf $(INPUT) 
     ~/jdk1.8.0_121/bin/java ... 

これはfoo%値は、あなたが構築したいターゲットに一致するので、その後、前提条件で%を置換しますfooの場合はSOMATIC/foo.vcfが存在し、再構築する必要がないのでレシピが実行されます。しかし、レシピは実際にターゲットを作成しませんFINAL/foosomatic.ensemble.gz;ターゲットFINAL/somatic_ensemble.gzを作成します。だから、このルールは、1つのことをするように指示するので壊れていますが、それは他のことをします。

すべてのレシピが自動変数[email protected]で表されるファイルを作成するようにしてください。あなたのルールの意味に同意してください。レシピで他のファイルを作成したい場合は、ルールが正しく書き込まれません。

次のmakeは、次の前提条件allFINAL/barsomatic.ensemble.gzで同じことを行います。そのファイルは存在しないので、makeはパターンルールを使用してビルドしようとしますが、同じ出力ファイルを作成します。

さらに3番目の.gzファイルFINAL/bazsomatic.ensemble.gzです。だからこそ、物事は3回実行されます。

パターンルールを明示的ルールビルドFINAL/somatic.ensemble.gzに変更すると、allターゲットの前提条件を構築する方法が見つからないため、このエラーが発生します。

問題は、OUTSORT2の作成です。出力ファイルは1つしか作成しませんが、OUTSORT2に3つの異なるファイルを含めるように設定しているので、makeは3つのファイルすべてを作成しようとします。あなたはこれが欲しい:

OUTSOMATIC = SOMATIC 
FINAL = FINAL 
INPUT = $(wildcard $(OUTSOMATIC)/*.vcf) 
OUTSORT2 = $(FINAL)/somatic.ensemble.gz 

.PHONY: all 
all: $(OUTSORT2) 

$(OUTSORT2): $(INPUT) 
     ~/jdk1.8.0_121/bin/java -XX:+UseSerialGC -Xms1g -Xmx10g -jar /illumina/software/PROG2/bcbio-variation-recall-0.1.7 ensemble -n 1 [email protected] /illumina/software/database/database_2016/hg19_primary.fa $^ 
+0

ありがとう! –

関連する問題