2014-02-23 5 views
0

10 개의 다른 파일에 대해 동일한 분석을 수행하는 프로젝트가 있습니다. 예를 들어 test1.txt .... test10.txt으로 시작합니다. 그들은 각각 test1 ... test10이라는 10 개의 다른 폴더에 설치됩니다. 파일에 대한 몇 가지 테스트를 실행하고 test1_v1.txt ... test10_v1.txt을 생성 한 다음, Rscript를 사용하여 분석을 한 번 더 실행하고 ... test10_v2.txt을 생성하는 Python 스크립트가 있습니다.반복되는 절차를 위해 makefile을 작성하는 방법은 무엇입니까?

TEST_FOLDER=test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 

test3/%_v1.txt: 
    @$(foreach var, $(TEST_FOLDER), python run_test.py -in $(var)/$(var).txt -out $(var)/$(var)_v1.txt;) 


test3/%_v1.txt: 
    @$(foreach var, $(TEST_FOLDER), Rscript run_stat.R -in $(var)/$(var)_v1.txt -out $(var)/$(var)_v2.txt;) 

나는 이것이 정말 나쁜 설치 알고, 더 정확한 종속성이 없습니다 : 지금은이 같은 makefile 설정을 가지고있다. test3/%_v1.txt의 파일에만 의존합니다. 나는 다음과 같은 것을 사용하려고 시도했다.

$(TEST_FOLDER)/$(TEST_FOLDER)_v1.txt:$(TEST_FOLDER)/$(TEST_FOLDER).txt 
     python run_test.py -in $^ -out [email protected] 

그러나 작동하지 않았다. makefile을 셸 스크립트가 아닌 makefile으로 만드는 것에 대한 제안은 훌륭합니다.

make은 훌륭합니다.

답변

2

약 속임수는 거꾸로해야합니다. 끝에서 벗어나고 싶은 것으로 시작하십시오. 이 경우 _v2.txt 파일입니다. 그래서 사람들은 일이 당신이 all에서에 달려있다 : 이제

TEST_FOLDER=test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 

all: $(foreach T,$(TEST_FOLDER),$T/$T_v2.txt) 

가 어떻게 사람들의 단일 하나를 만들 수 있습니까? make 규칙을 작성할 때마다 각 규칙은 하나의 명령 또는 하나의 출력을 생성하는 명령 세트를 이상적으로 실행해야합니다. 루프를 사용하여 하나의 규칙에서 같은 종류의 출력을 여러 개 생성하지 마십시오. 패턴 규칙으로 다음 그 규칙을 쓰기 :

%_v2.txt : %_v1.txt 
     Rscript run_stat.R -in $< -out [email protected] 

는 이제 _v1.txt 파일을 만들 규칙을 쓰기 :

%_v1.txt : %.txt 
     python run_test.py -in $< -out [email protected] 

가 이제 완료!

+0

감사합니다. 이 질문에 대한 마지막 질문 : $ T와 $ (T)의 차이점은 무엇입니까? – msakya

+0

또한'% _v2.txt : % _v1.txt :'에서 폴더 위치를 지정하지 않은 이유는 무엇입니까? '%'는 모든 폴더에서 파일을 찾습니까? 죄송합니다, 카운터 질문에 대해 – msakya

+0

차이점은 없습니다 : makefile에서'$'는 변수를 소개합니다. 변수는'$ @','$ <','$ T'와 같이 하나의 문자가 길거나 여러 문자 일 수 있습니다. 길이가 1 문자를 초과하면 괄호'$ (FOO)'또는 중괄호'$ {FOO} '로 묶어야합니다. 물론 원하는 경우'$ (T)','$ (@)'등도 쓸 수 있습니다. 이러한 표현 사이의 기능에는 차이가 없습니다. 모두 동일합니다. – MadScientist

관련 문제