2017-10-17 8 views
0

Makefile의 설치 부분을 작성 중이며 프로젝트가 빌드되었는지 확인하고 싶습니다. 설치가 실패하면 실패합니다. 그 목적을 위해 특정 디렉토리가 있는지 여부를 확인하고 싶습니다. 적절한 오류 ("모든 것을 먼저 실행하십시오"와 같은)로 실패합니다.Makefile - 디렉토리가 없으면 실패 함 - 크로스 플랫폼

또한이 Makefile이 Linux, Windows (mingw) 및 MacOS에서 작동하기를 원합니다.

아무도 도와 줄 수 있습니까?

답변

3

당신이 GNU 만들거나 버전 사용하는 경우 가 order-only prerequisites을 지원하는 경우 자연스러운 해결책이 있습니다. 이 디렉토리를 설치 대상의 주문 전제 조건으로 선언하십시오.

install: | $(DIRS) 
    <install recipe> 

$(DIRS): 
    @echo "please run make all first" && exit 1 
1

당신이와 Mingw 메이크업을 사용하는 경우, 다음 대답은 모든 플랫폼에서 동일 sholud :

dirs-exist: 
     test -d dir1 || echo Run make install first && exit 2 
     test -d dir2 

에서 우리가 시험이 실패 할 경우 메시지를 인쇄 할 수 또는 연산자를 사용하여 첫 번째 디렉터리를 들어. 그러나 메시지를 성공적으로 인쇄했지만 전체 행이 실패하기 때문에 2의 오류 코드로 종료합니다. 모든 경우에 메시지를 갖고 싶으면 위의 논리를 각 디렉토리에 적용 할 수 있습니다. 당신이 디렉토리가 많은 경우, 다음과 같은 루프는 Windows에서 nmake를하고 cmd를 함께 작동하도록이 필요한 경우에만 복잡성이 될 것

test_dirs: 
    for d in dir1 dir2; do if test \! -d $$d; then echo run make install first; exit 2; fi 

작동 할 수 있습니다; 그게 문제가 아닌 것 같은데.

+0

감사합니다! 해당 디렉토리 중 하나가 존재하지 않으면 어떻게 오류 메시지를 출력 할 수 있습니까? – fx23

+0

에코와 출구에서 중괄호가 필요하다고 생각합니다. – HardcoreHenry

1

@ SamHarman의 대답은 정확합니다. (그리고 그는 이전에 게시했습니다.) 그래서 첫 번째 예를 수정하자마자 대답을 받아 들여야합니다. 어떤 경우에, 나는 :-) ... 나는 같은 일의 약간 짧고 약간 더 혼란 버전 인뿐만 아니라이를 게시 거라고 생각

DIRS=dir1 dir2 dir3 

checkdirs: 
     [[ 1 ${DIRS:%= && -d %} ]] || (echo "uh oh..." && false); 

.PHONY: checkdirs