2017-05-24 5 views
0

을 생성 나는 메이크 [[email protected] 415]$ make --version GNU Make 3.81메이크 : 3 입력에서 하나 개의 출력

내가 3 파일이 디렉토리 체세포가이 버전이있다. 나는 하나의 산출물만을 생산하려고합니다. 이것은 내가 쓴 것입니다.

`이 스크립트

`

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 시간 동일한 파일을 확인하십시오. 같은 시간에 사용할 입력 목록에서 하나의 출력 만 만드는 방법을 이해하지 못합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? $(FINAL)/%somatic.ensemble.gz을 변경하면 $(FINAL)/somatic.ensemble.gz

make: *** No rule to make target FINAL/415_merge_mutect2.somaticsomatic.ensemble.gz', needed by 모두가 표시됩니다. 멈춤`

답변

1

아마도 make가 어떻게 작동하는지 설명하는 GNU make 매뉴얼 소개 섹션을 검토해야 할 것입니다.

메이크 파일을 살펴 보겠습니다. 먼저 몇 가지 변수를 정의하십시오. 파일이 SOMATIC/foo.vcf, SOMATIC/bar.vcfSOMATIC/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는 최신 정보도 가지고 있다고 가정합니다.

다음 make는 대상 FINAL/foosomatic.ensemble.gz을 빌드하려고합니다. 그럼 확인

$(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을 생성합니다. 그래서이 규칙은 그것이 한 가지를 할 것이라고 말하기 때문에 부서 지지만, 다른 것을합니다.

항상 모든 요리법이 자동 변수 [email protected]으로 표시된 파일을 빌드해야합니다. 그러면 귀하가 귀하의 규칙의 의미에 동의하게됩니다. 요리법에서 다른 파일을 작성하려면 규칙이 잘못 작성됩니다.

다음 make는 다음 전제 조건 인 all을 사용하여 동일한 작업을 수행합니다. FINAL/barsomatic.ensemble.gz. 그 파일이 존재하지 않기 때문에, make는 패턴 규칙을 사용하여 파일을 빌드하려고 시도하지만 동일한 출력 파일을 다시 만듭니다.

다시 3 번째 .gz 파일 FINAL/bazsomatic.ensemble.gz. 그것이 사물을 세 번 실행하는 이유입니다.

원하는대로 패턴 규칙을 명시적인 규칙 빌드 FINAL/somatic.ensemble.gz으로 변경하면 all 대상의 전제 조건을 빌드하는 방법을 찾을 수 없으므로이 오류가 발생합니다.

문제는 OUTSORT2이 생성되었습니다. 하나의 출력 파일 만 만들고 싶지만 OUTSORT2에 세 개의 다른 파일을 포함하도록 설정하면 make가 세 개의 파일을 모두 만들려고합니다. 원하는 항목 :

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

감사합니다. –