2008-10-22 4 views
18

빌드 규칙을 적용하기 전에 도구를 실행하여 시작하는 Makefile이 있습니다 (이 도구에서 작성한 것입니다). 파이썬 스크립트 인이 도구가 null이 아닌 상태 코드로 종료되면, GNU Make가 바로 그곳에서 멈추고 프로그램을 빌드하지 않기를 바랍니다.

현재,이 같은 (최상위, 즉 열 1) 수행

$(info Generating build rules...) 
$(shell python collect_sources.py) 
include BuildRules.mk 

1. 상태 코드 collect_sources.py 종료이도의 표준 출력을 캡처하지만이 만들어 멈추지 않는다 collect_sources.py하지만 인쇄되지 않으므로 잘못된 방향으로보고 있습니다.

단순한 MS-DOS 셸이 표준 시스템 셸인 경우 솔루션이 작동해야합니다.

의견이 있으십니까?

+1

GNU make 4.2 이상을 사용하면 평가 된 마지막'$ (shell ...) '함수의 종료 상태를 포함하는'$ (.SHELL_STATUS)'변수를 확인할 수 있습니다. – MadScientist

+0

변수 이름은'$ (. SHELLSTATUS)'이며,'_ '는 붙지 않습니다. https://www.gnu.org/software/make/manual/html_node/Shell-Function.html # Shell-Function – user3159253

답변

4

좋아, 여기 불행히도 collect_sources.py 스크립트의 상태 코드를 기반으로하지 않는 내 자신의 솔루션은, 그러나 나 (TM)을 위해 작동하고 스크립트가 생산하고 나 출력을 볼 수있는 :

SHELL_OUTPUT := $(shell python collect_sources.py 2>&1) 
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),) 
    $(info $(SHELL_OUTPUT)) 
else 
    $(error $(SHELL_OUTPUT)) 
endif 

모든 오류가 "collect_sources: error:"으로 시작하는 출력을 생성하도록 스크립트가 작성되었습니다. 또한, 파이썬이 주어진 스크립트를 찾거나 실행할 수없는 경우 메시지 "[Errno 2]" 또는 이와 유사한 메시지를 포함하는 오류 메시지를 출력합니다. 따라서이 작은 코드는 출력 (stderr을 stdout으로 리디렉션)을 캡처하고 오류 메시지를 검색합니다. 아무 것도 발견되지 않으면 단순히 $(info)을 사용하여 출력을 인쇄합니다. 그렇지 않으면 $(error)을 사용하여 효과적으로 중지합니다.

ifeq ... endif의 들여 쓰기는 공백으로 이루어집니다. 탭이 사용되면 Make는 명령을 호출하려고하고 있다고 생각하고 그것에 대해 불평합니다.

6

는 더 나은 방법이있을 수 있습니다, 그러나 나는 시도 다음과 작동 :

여기
$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed)) 

나는 your_command가 출력을 제공하지 않습니다 가정 않았지만, 그러한 해결하기 어려운 안 상황.

편집 : 기본 Windows 셸 (및 적절한 쉘)에서 작동하게하려면 shell 함수 내에서 if 대신 your_command && echo ok을 쓸 수 있습니다. 나는 이것이 구형 DOS 셸에서는 가능하지 않다고 생각한다. 이 경우 아마도 your_command을 적용하거나 오류 (또는 성공)시 인쇄 할 래퍼 스크립트를 작성해야합니다.

+0

유닉스 쉘을 가정합니다. – JesperE

+0

감사합니다, 올바른 방향으로 나아가는 것처럼 보입니다. sherr()처럼 매크로화 될 수 있기를 바랍니다. –

+0

유닉스를 생각하고 싶다면 (내가 전적으로), 이것이 유일하게 발견 된 유일한 변종이었습니다. 나는'$ (eval $ (call template, arg1, arg2)')라는 정의 템플릿에서 몇 가지 말도 안되는 것을하고 있었는데, 이것은 위의 것들과 완전히 동일하지만,'$ $'* everything *. 언젠가는 someboedy 혜택이 있기를 바란다. (처음에'@'는 내가 타겟 정의에 있기 때문에)'@ $$ ($$ (쉘 if ./generate.sh $) $ (1)]에서) [$ (2)]을 생성 할 수 없습니다.) ' – sjm324

4

당신은 BuildRules.mk을 생성하기 위해 정기적 대상을 사용한다 :

BuildRules.mk: collect_sources.py 
     python $< >[email protected] 

include BuildRules.mk 

이 자동으로 종속성을 생성 할 때 사용하는 표준 트릭입니다.

+0

Jesper, 입력 해 주셔서 감사합니다. 당신의 규칙으로 내 문제를 해결할 수있는 방법을 알지 못합니다. 매번 실행하기 위해 collect_sources.py가 필요합니다. 그래서 소스 파일과 규칙 등의 목록을 업데이트 할 수 있습니다. 또는 무언가가 누락 되었습니까? –

+0

".PHONY : BuildRules. mk "를 누른 다음 – JesperE

+0

아마도 여기 뭔가 명백한 것이 빠졌지 만 올바르게 작동하지 않는 것처럼 보일 수 있습니다. BuildRules.mk는 매번 (.PHONY를 사용하여) 다시 작성되지만 포함은 전에 발생합니다 이것은 효과적으로 당신이 항상 있음을 의미합니다. 이전 BuildRules.mk를 사용합니다. – mweerden

-1

-k 옵션을 사용하여 make/gmake를 호출하지 않았는지 확인하십시오.

+0

당신의 제안은 논리적으로 보입니다. 사실,'-k' 옵션은'shell' 함수에서 실패한 명령에'make'의 동작에 영향을 미치지 않습니다. –

관련 문제