おそらく、GNU makeマニュアルの入門セクションで、makeの仕組みを説明するセクションを参照してください。
メイクファイルを見てみましょう。まずいくつかの変数を定義します。ファイルSOMATIC/foo.vcf
、SOMATIC/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は、次の前提条件all
:FINAL/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 $^
ありがとう! –