2009-02-26 6 views
11

삭제하기 않습니다왜 GNU는 파일 내가 테스트를 실행하기위한 약간 hackish 메이크있어

### Run the tests 

tests := tests/test1 tests/test2 ... 

test: $(tests) 

$(tests): %: %.c 
    gcc -o [email protected] $(testflags) $< 
    [email protected] 

그것은 작동을하지만, 내가 전에 할 본 적이 무언가를 확인합니다. 내 테스트가 현재 중단되어 버스 오류가 발생합니다. Make는 다음과 같은 결과를 출력합니다 :

gcc -o tests/test1 [flags blah blah] tests/test1.c 
tests/test1 
make: *** [tests/test1] Bus error 
make: *** Deleting file `tests/test1' 

궁금한 점이 있습니다. 나는 Make가 전에 그것을 한 번도 본 적이 없다. make가 컴파일 된 테스트를 삭제하는 이유는 무엇입니까?

참고 :이 예제를 매우 간단하게 편집하여 더 간단하게 만들었습니다. 나는 실수를했을 수도있다.

답변

14

대상이 올바르게 작성되지 않았기 때문일 수 있습니다. 다음에 make 프로젝트를 실행하면 대상을 다시 작성하려고 시도합니다. 파일이 제거되지 않은 경우 make은 잘못된 것을 알 수있는 방법이 없습니다. make은 실패를 테스트 대상에서 빌드하는 프로세스가 아니라는 것을 알 수 없습니다.


이 동작이 바람직한 지의 여부는 테스트의 성격에 따라 다릅니다. Bus error이 발생하지 않도록 테스트를 수정하려면 대상을 제거하는 것이 중요하지 않습니다. 나중에 디버깅을 위해 타겟을 사용하려면 make 프로세스를 변경해야합니다.

대상을 삭제하지 않는 한 가지 방법은 .PRECIOUS 대상을 사용하는 것입니다.

$(tests): %: %.c 
    gcc -o [email protected] $(testflags) $< 
    [email protected] 

테스트하지,하지만 documentation 대상이 제거되지 않습니다 나타냅니다 :


또 다른 수 있습니다

오류가 있는지 확인이 무시하라고되지 않은 발생하면 , 그것은 현재 목표물이 정확하게 다시 만들어 질 수없고, 직접적으로 또는 간접적으로 그것에 의존하는 어떤 것도 할 수 없다는 것을 의미한다. 그들의 전제 조건이 달성되지 않았으므로이 목표에 대해 더 이상의 명령이 실행되지 않습니다.

과 :

보통 명령이 실패 할 때, 전혀 대상 파일을 변경 한 경우, 파일이 손상되어 사용 또는 수 없습니다 적어도 완전히 업데이트되지 않습니다. 그러나 파일의 타임 스탬프에 따르면 최신 버전이므로 다음에 실행될 때 해당 파일을 업데이트하지 않습니다. 이 상황은 명령이 신호에 의해 종료 될 때와 동일합니다. 인터럽트를 참조하십시오. 그래서 일반적으로 옳은 일은 파일을 변경하기 시작한 후 명령이 실패하면 대상 파일을 삭제하는 것입니다. .DELET_ON_ERROR가 타겟으로 나타나면 make는 이것을 할 것입니다. 이것은 거의 항상 당신이하고자하는 일이지만, 역사적인 관행은 아닙니다. 따라서 호환성을 위해 명시 적으로 요청해야합니다. 이 문제를 방지하기 위해

11

한 가지 방법은 두 단계로 빌드와 테스트 실행을 분할하는 것입니다

tests := tests/test1 tests/test2 ... 

test: $(tests) runtests 

$(tests): %: %.c 
    gcc -o [email protected] $(testflags) $< 

runtests: %.out: % 
    $< | tee [email protected] 

는 (사람이 그것을 수정 주시기 나의 메이크업 구문 아마 오류가있다.) 일반적인 아이디어는 테스트 실행이 출력 파일을 생성하도록하는 것인데, 이는 make이 각 테스트를 개별적으로 쉽게 실행하도록합니다.

+1

+1은 테스트 프로그램을 생성하고 단일 규칙으로 실행하는 버그가있는 메이크 파일 때문에 동작이 발생했다는 유일한 답입니다. –

+0

IMO가 더 나은 해결책입니다 : 더 깨끗하고 더 많은 "make-like". 그러나 세부 정보는보다 명확하게 처리 될 수 있습니다. 먼저 메이크 파일 작성자가 결정해야합니다. 테스트를 항상 실행하고 싶거나 테스트 파일이 다시 작성된 경우에만 테스트를 실행하고 싶습니다 (후자는 원래 예제에서와 동일). – MadScientist

6

이것은 make의 기본 동작입니다. 명령이 오류 코드 (예 : 0이 아닌 값)를 반환하면 작성 대상이 삭제됩니다. .PRECIOUS 및 .IGNORE makefile 지시문은이 동작을 변경할 수 있습니다.