문제
빌드 규칙을 적용하기 전에 도구를 실행하여 시작하는 Makefile이 있습니다 (이 도구는 저를 위해 작성합니다). Python 스크립트 인이 도구가 널 상태가 아닌 상태 코드로 종료되면 GNU가 바로 거기에서 멈추고 프로그램 구축을 계속하지 않기를 바랍니다.
현재 나는 이와 같은 일을한다 (최상위 레벨, 즉 열 1) :
$(info Generating build rules...)
$(shell python collect_sources.py)
include BuildRules.mk
그러나 이것은 만약을 멈추지 않습니다 collect_sources.py
상태 코드가 1 인 종료 collect_sources.py
그러나 인쇄하지 않으므로 잘못된 방향으로보고있는 느낌이 있습니다.
가능한 경우 간단한 MS-DOS 쉘이 표준 시스템 쉘 일 때 솔루션이 작동해야합니다.
어떠한 제안?
해결책 2
자, 여기에 내 자신의 솔루션이 있습니다. 불행히도 Collect_Sources.py 스크립트의 상태 코드를 기반으로하는 것이 아니라 저에게 적합하며 스크립트가 생성하는 출력을 볼 수 있습니다.
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:"
. 또한 Python이 주어진 스크립트를 찾거나 실행할 수없는 경우 메시지가 포함 된 오류 메시지를 출력합니다. "[Errno 2]"
또는 유사합니다. 따라서이 작은 코드는 출력 (STDERR 리디렉션 STDOUT)을 캡처하고 오류 메시지를 검색합니다. 아무것도 발견되지 않으면 단순히 사용합니다 $(info)
출력을 인쇄하려면 사용합니다 $(error)
, 효과적으로 Make 중지를합니다.
의 들여 쓰기에 유의하십시오 ifeq ... endif
공간으로 이루어집니다. 탭을 사용하는 경우 명령을 호출하려고한다고 생각하고 불만을 제기하십시오.
다른 팁
더 나은 방법이 있을지 모르지만 다음을 시도했는데 작동합니다.
$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed))
여기서 나는 그것을 가정했다 your_command
출력은 제공하지 않지만 그러한 상황을 해결하기가 어렵지 않아야합니다.
편집 : 기본 Windows 쉘 (및 아마도 괜찮은 쉘)으로 작동하도록하려면 쓸 수 있습니다. your_command && echo ok
대신 if
내 shell
기능. 나는 이것이 (오래된) DOS 쉘에게는 가능하지 않다고 생각합니다. 이것들을 위해 당신은 아마도 적응하고 싶을 것입니다 your_command
또는 래퍼 스크립트를 작성하여 오류 (또는 성공)시 무언가를 인쇄하십시오.
일반 대상을 사용하여 buildrules.mk를 만들어야합니다.
BuildRules.mk: collect_sources.py
python $< >$@
include BuildRules.mk
이는 종속성을 자동으로 생성 할 때 사용하는 표준 트릭입니다.
고정 https://stackoverflow.com/a/226974/192373
.PHONY: BuildRules.mk
BuildRules.mk: collect_sources.py
echo Generating build rules...)
python $< >$@
$(MAKE) -f BuildRules.mk
-K 옵션으로 Make/Gmake를 호출하지 않도록하십시오.