2011-10-27 2 views
5

에 대한 작업을 실행합니다메이크업 : 나는 내 메이크에서이 같은 규칙을 구축하고자하는 각각의 전제 조건

log: test_A test_B 
    ./test_A >> [email protected] 
    ./test_B >> [email protected] 

하지만 test_Atest_B$(TESTS) 변수의 일부입니다.

GNU/make의 각 전제 조건에 대한 조치 (여기서는 프로그램 호출)가 가능합니까?

참고 : How do I make a makefile rule execute its prerequisites?은 대상이 log (make log)이어야하므로이 문제를 완전히 해결하지 못합니다.

답변

15

기본적으로 필수 구성 요소를 반복하고 싶습니다. 이 작업을 수행 할 수있는 확실한 방법은 쉘에 펀트하는 것입니다 : 당신이 조심해야 불구하고 GNU는 foreach 루프를 확인 당신이 루프를 작성할 수

log: test_A test_B 
     for f in $^; do ./$$f; done 

또는 그 루프의 몸에서 결과 명령 별도의 행에 표시 (define를 통해) 또는 (즉, 세미콜론, 쉽게) 쉘 종료와 함께 종료됩니다 :

log: test_A test_B 
     $(foreach f,$^,./$(f);) 

마지막으로,이 경우에는 좀 더 간결을 쓸 수와 같은 더 모호 루프 할 각 항목의 패턴 대체 :

가 (. 난 당신이 출력 리디렉션 및 적절한 $(TESTS) 변수를 추가 할 수 있습니다 확신) 귀하의 답변에 대한

+1

감사합니다, 그것은 내가 함께 결국 무엇을 확인 : '$ (foreach는 테스트, $^$ (shell ./$(test) >> $ @))' – CJlano

+1

당신의 _log_ 규칙에 대한 명령이라면,'$ (shell ...)'은 다소 우스꽝스러운 일입니다 : 규칙에 대한 명령은 비어있을 것입니다 'test_?'실행은 (명령을 실행하여 일어나는 것이 아니라) 명령을 알아내는 부산물로 발생합니다. 철학적으로 잘못되어 - 실제로는 - 당신의'test_? '스크립트 중 하나의 실패를 잡기 위해 확장하는 것이 불가능합니다. (그러나 그럼에도 불구하고이 대답을 받아 들일 수있는 것으로 표시하고 싶어하는 것처럼 보일 것입니다 ...) –

+0

test_A에 대해 한 번 test_B에 대해 한 번이 루프를 두 번 실행 하시겠습니까? 나는 비슷한 문제가있어서 make가 매우 이상하게 행동합니다. – Jaseem

관련 문제