2017-12-21 46 views
2

해야합니까 은 전제 조건을 갖춘 파일을 항상 리메이크하지만 파일을 가리키지 않으며 레시피가 없습니다. 아니면 은 하나 이상의 필수 구성 요소를 다시 만들어야하는 경우에만 이러한 대상을 다시 만드시겠습니까?GNU make는 파일이 아닌 타겟을 항상 다시 제작 된 것으로 간주합니다. (가능한 버그?)

예를 들어, 아래 표시된 Makefile에서 전제 조건이 있지만 파일을 가리 키지 않는 objects이라는 대상을 추가했습니다. 주요 타겟은 이며, 이는 objects (및 잠재적으로 다른 필수 조건)에 따라 다릅니다.

file1 file2 file3: ;  touch [email protected] 

objects: file1 file2 

program: objects file3 ; @echo 'Making [email protected]' 

내 기대는 make program가 실행하고 어떤 파일 전제 조건이 리메이크 할 필요가 없습니다 (예 : 파일 1, 파일 2 및 파일 3 모두에 해당) 때, program이 리메이크되어서는 안된다는 점이다.

실제 GNU 동작은 program의 레시피가 항상 실행된다는 것입니다 (전제 조건 파일과 관계 없음). objects은 항상 재 작성된 것으로 간주되어 종속성 (즉, program)을 다시 작성해야하기 때문입니다.

실행하여 확인할 수 있습니다 make --trace -d --no-builtin-rules program을하고 를 확인 것을 볼 수 있습니다 항상 ". 대상 '객체'를 리메이크해야"출력 그래서 objects는 항상 "후계자"(그것이 어떤 조리법이 없다하더라도) 항상 새롭게 업데이트 된 것으로 간주됩니다.

objects은 실제 파일을 가리 키지 않기 때문일 가능성이 큽니다. 그러나 나는 그것이 제조법이 없었기 때문에 그것이 필요하다는 것을 기대하고 있었다. 왜냐하면 그것의 전제 조건들 중 어느 것도 다시 만들어 질 필요가 없다면 그것이 다시 만들어지지 않을 것이기 때문이다.

예상되는 동작입니까, 아니면 버그입니까?

GNU Make manual 상태 : 규칙이 전제 또는 조리법 및 규칙 의 대상이 없습니다

경우는 규칙이있을 때마다 가 업데이트 된 것으로, 다음의 상상이 대상을 존재하지 않는 파일입니다 운영. 이것은 이것에 의존하는 모든 타겟 은 항상 레시피가 실행된다는 것을 의미합니다.

는하지만 그 설명은 objects 대상 는 않기 때문에이 전제 조건을 가지고, 위의 경우에는 적용되지 않습니다. 그러나 동작은 동일하며 만들기 매뉴얼을 수정하여이를 분명히해야합니다.

몇 가지 추가 참고 사항 :

  • 나는 쉽게 독자 코드를 복사하여 붙여 넣기 할 수 있도록 위의 조리법 후 세미콜론 형식을 사용했다. 그렇지 않으면 웹 페이지에서 복사 할 때 탭이 보통 탭 들여 쓰기 레서피 형식의 공백으로 변환됩니다.물론

  • 는 난 그냥 파일의 목록을 가리 위의 objects 대상의 장소에 사용하는 것이 변수 $(OBJECTS) 것을 만들 수 있다는 것을 알고있다. 그것은 실제로 요점이 아닙니다.

  • This question도 예상되는 동작인지 또는 버그가 논의되지 않았는지 여부와 관계없이 동일한 동작을 포함하는 것처럼 보입니다. 나는 GNU이 확인 사용하고

  • 4.2.1

답변

4

난 당신이 인용 한 단락에 불과, 이미 다른 곳에서 특정의 행동의 특정 사건을 재현하면서 어떻게 FORCE을위한 장면을 설정하기 위해 있다고 생각 공장. 당신이 그 제조법 대상 파일을 만들지 않습니다, 조리법 때마다 실행됩니다 규칙을 작성하는 경우

대상이 온다 : 실제로

간단하면서도 더 일반적인, 문 previous section가 이루어집니다 다시 만들기 위해.

그리고 다시 here :

타겟이 존재하지 않는 경우 유효 기간이 경과하거나 전제 조건들보다이 경우 나이.

따라서 관찰하고있는 동작은 전적으로 예상됩니다.