2009-07-10 3 views
2

GNU Make 버전 3.81에는 명령 줄에 대상이 지정되지 않은 경우 목표 (또는 대상)를 작성해야하는지 확인하는 데 사용할 수있는 .DEFAULT_GOAL이라는 특수 변수가 도입되었습니다. 그렇지 않으면 Make는 처음 만나는 대상을 간단하게 만듭니다.빈 타겟 규칙은 ​​GNU Make에서 .DEFAULT_GOAL을 대체 할 수 있습니까?

고려 "바"를 구축 할 것입니다 make를 실행 위의 가상 메이크와

 
bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

, 그것은 만남을 만들기 첫 번째 대상이기 때문이다. 우리가

 
.DEFAULT_GOAL := foo # Build foo by default, even if it's not first. 

bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

...과 같이, .DEFAULT_GOAL을 추가하는 경우하지만 ... 우리는 단지 make을 실행하면 "foo는"을 구축 할 것입니다 (버전 3.81)를 확인합니다.

이 .DEFAULT_GOAL 변수는 내가 작성한 모듈 형의 재사용 가능한 Makefile "프레임 워크"에서 유용하다는 것을 알았습니다. 그러나 많은 시스템에 GNU Make 3.80 이전 버전이 있고이 변수를 지원하지 않는다는 것을 알았습니다.

 
foo: # Empty target rule 

bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

을 내가 알고 : 것들로 주위를 재생하는 동안

, 나는 단순히 빈 대상 규칙을 지정하는 확인도 GNU의 이전 3.81 버전, .DEFAULT_GOAL 것과 같은 효과를 갖고있는 것 같아요 것으로 나타났습니다 이 방법으로 추가 대상 규칙을 지정하여 대상의 규칙 및/또는 기본 규칙에 추가하는 것이 타당하고 합법적입니다. 그러나이 작업을 수행하면 .DEFAULT_GOAL을 사용할 때 발생하지 않는 잠재적으로 바람직하지 않은 부작용이 발생할 수 있습니다.

간단한 공백 대상 규칙으로 동일한 작업을 수행 할 수 있다면 왜 .DEFAULT_GOAL이 도입되었는지 궁금합니다. 이것은 내가 정확히 같은 같은 결과가 아닌 것으로 의심됩니다.

그렇다면 결론은 .DEFAULT_GOAL과 빈 대상 규칙 사이에 외부 적으로 감지 할 수있는 차이가 있습니까?

답변

2

내가 당신에게 확답을 줄 수는 없지만, 나는 그것의 도입에 대한 다른 이유 제안 할 수 있습니다 :

  1. 그것은 무엇을 .DEFAULT_GOAL 즉시 명백를; 라벨에 표시된 내용 한 줄짜리 빈 타겟의 존재와 의미는 특히 더 큰 Makefile에서 쉽게 볼 수 있습니다.
  2. $(.DEFAULT_GOAL)의 값을 실제로 Makefile의 다른 곳으로 읽을 수 있습니다. 테스트는 명시 적으로 설정되었는지 또는 첫 번째 규칙을 선택하여 결정되는지 여부에 차이가 없음을 의미합니다.
2

"foo : # 빈 대상 규칙"이 이중 콜론 규칙과 충돌합니다.

이들을 제외하면 (:: rules) 첫 번째 규칙 인 경우에만 작동합니다. 따라서 처음에 "clear-variables.mk"를 포함하고 일반적으로 포함 파일이 복잡한 네트를 가지고있는 경우 이 ".DEFAULT_GOAL"은 & 을 확인하고을 선택하면 1 개의 규칙 만 기본값이 될 수 있습니다.

관련 문제