문제

빌드 규칙을 적용하기 전에 도구를 실행하여 시작하는 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 대신 ifshell 기능. 나는 이것이 (오래된) 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를 호출하지 않도록하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top