Makefile 변수
•
환경변수 MAKEFILES가 정의된 경우, make는 해당 값을 다른 값보다 먼저 읽을 추가 makefile의 이름 목록으로 간주합니다. (공백으로 구분) 이것은 include 지침과 매우 유사합니다 : 그 파일들을 위해 다양한 디렉토리가 검색됩니다. 또한 이런 makefiles 중 하나 또는 include 된 makefile에서 기본 goal을 가져오지 않거나 MAKEFILES에 나열된 파일을 찾을 수 없는 경우 오류가 아닙니다.
•
MAKEFILES의 주요 용도는 make의 재귀 호출 할 때 있습니다. 그래서 make의 최상위 호출 전에 환경 변수를 설정하는 것은 바람직하지 않습니다. 왜냐하면 보통 외부의 makefile을 건들지 않는 것이 더 낫기 때문입니다. 하지만 특정 makefile 없이 make를 실행하는 경우 검색 경로를 정의하는 등의 작업을 수행할 수 있습니다.
•
일부 사용자는 로그인 시 환경에 MAKEFILES를 자동으로 설정하려고 시도합니다. 그때 프로그램은 이 작업이 완료될 것으로 예상되는 파일을 만듭니다. 그러나 다른 사람이 사용하면 이런 makefiles가 작동하지 않기 때문에 이것은 아주 나쁜 생각입니다. makefiles에 명시적인 포함 지침을 작성하는 것이 훨씬 좋습니다.
Makefile이 다시 만들어지는 방법
•
때때로 Makefile은 RCS 또는 SCCS파일과 같은 파일에서 다시 만들 수 있습니다. 만약 Makefile이 다른 파일에서 만들게 된다면 아마도 당신은 Make가 읽을 최신 버전의 Makefile을 가져오길 원할 것입니다.
•
이를 위해 모든 Makefile들의 make를 읽기 전에 처리된 순서대로 각 목표 target을 고려할 것입니다. 그리고 이것이 업데이트하기를 시도할 것입니다. 병렬 빌드가 활성화 된다면 Makefile도 병렬로 다시 빌드됩니다.
•
Makefile에 업데이트하는 방법을 알려주는 명시적 규칙이 있거나 암시적 규칙이 적용되는 경우 필요한 경우에 업데이트 됩니다.
•
모든 Makefile이 실제로 변경된 것이 있는 지 확인한 후 make은 새 슬레이트로 시작하여 모든 만들기 파일을 다시 읽습니다. 또한 다시 시작할 때마다 특수 변수 MAKE_RESTART가 업데이트됩니다
•
하나 이상의 Makefile을 다시 만들 수 없다는 것을 알고 있는 경우나 make가 암시적 규칙 검색을 하지 못하도록 하는 경우 암시적 규칙 조회를 하지 못하게 하는 방법을 사용할 수 있습니다. ex) Makefile을 대상으로 명시적 규칙을 작성하고 빈 레시피를 작성할 수 있다.
•
Makefile이 이중 콜론 규칙을 지정하여 레시피는 있지만 전제 조건이 없는 파일을 다시 만들면 해당 파일은 항상 다시 만들어집니다.
•
Makefile의 경우, 레시피가 있는 이중 콜론 규칙이 있지만 조건이 없는 Makefile은 make가 실행될 때마다 다시 만들어지고 make가 다시 시작되고 Makefile을 다시 읽은 후에 다시 만들어집니다. 따라서 이렇게 하면 무한 루프가 발생합니다. make는 계속해서 Makefile을 다시 만들고 다시 시작하며 다른 작업을 수행하지 않습니다.
•
그래서 이를 방지하려고 make는 레시피가 있지만 전제 조건이 없는 이중콜론 규칙의 대상으로 지정된 Makefile을 다시 만드려고 하지 않습니다.
•
Phony target의 효과는 다음과 동일한 효과를 가집니다. 이러한 파일은 결코 최신 상태로 간주되지 않으므로 phony로 표시된 포함된 파일은 make를 계속 다시 시작하게 됩니다.
•
당신은 다음을 활용하여 시작 시간을 최적화 할 수 있습니다. 만약 당신이 Makefile을 다시 만들 필요가 없다는 것을 알고 있다면 다음 중 하나를 추가하여 make가 다시 만들려고 하지 않도록 시도할 수 있습니다.
.Phony: Makefile
# 또는
Makefile:: ;
Makefile
복사
•
만약 당신이 ‘-f’ 또는 ‘-file’ 옵션으로 지정하지 않는 경우, make는 기본 Makefile 이름을 시도합니다.
•
‘-f’ 또는 ‘—file’ 옵션으로 명시적으로 요청된 Makefile과 달리 make는 이러한 Makefile이 존재해야 하는 지 확신하지 못합니다. 그러나 기본 makefile이 없지만 make 규칙을 실행하여 만들 수 있는 경우, makefile 을 사용할 수 있도록 규칙을 실행해야 할 수 있습니다. 따라서 기본 make 파일이 하나도 없으면 make는 하나를 만드는 데 성공하거나 시도할 이름이 부족할 때까지 각각을 만들려고 시도합니다.
•
make가 makefile을 찾거나 만들 수 없는 경우 오류가 아닙니다. makefile이 항상 필요한 것은 아닙니다.
•
'-t' 또는 '--touch' 옵션을 사용하는 경우 오래된 makefile를 사용하여 터치할 target을 결정하지 않을 수 있습니다. 따라서 '-t' 옵션은 makefile 업데이트에 영향을 미치지 않습니다. 즉 '-t'가 지정된 경우에도 실제로 업데이트됩니다. 마찬가지로 '-q'(또는 '--question')와 '-n'(또는 '--just-print')는 오래된 Makefile이 다른 대상에 대해 잘못된 출력을 초래할 수 있기 때문에 Makefile의 업데이트를 방해하지 않습니다. 오래된 makefile은 다른 대상에 대해 잘못된 출력을 초래할 수 있기 때문입니다. 따라서 'make -f mfile -n foo'는 mfile을 업데이트하고 읽은 다음 실행하지 않고 foo 및 해당 전제 조건을 업데이트하는 레시피를 인쇄합니다. foo에 대해 인쇄된 레시피는 mfile의 업데이트된 내용에 지정된 것입니다.
•
경우에 따라 메이크파일의 업데이트도 실제로 막고 싶을 수 있습니다. 명령줄에서 Makefile을 목표로 지정하고 Makefile로 지정하여 이를 수행할 수 있습니다. Makefile 이름이 목표로 명시적으로 지정된 경우 옵션 '-t' 등이 적용됩니다. 따라서 'make -f mfile -n mfile foo'는 makefile의 mfile을 읽고 업데이트하는 데 필요한 레시피를 인쇄한 다음 실행하지 않고 foo를 업데이트하는 데 필요한 레시피를 인쇄합니다. foo의 레시피는 mfile의 기존 내용에 의해 지정된 레시피가 됩니다.
다른 Makefile의 일부 재정의
•
때때로 다른 메이크파일과 거의 같은 메이크파일을 갖는 것이 유용합니다. 종종 'include' 지시문을 사용하여 하나를 다른 하나에 포함하고 더 많은 대상 또는 변수 정의를 추가할 수 있습니다. 그러나 두 개의 메이크파일이 동일한 대상에 대해 서로 다른 레시피를 제공하는 것은 유효하지 않지만 다른 방법이 있습니다.
•
makefile이 들어있는 곳에서 makefile이 포함된 정보로 만들 수 없는 대상을 다시 만들려면 매치-스캐너 패턴 규칙을 사용할 수 있습니다. make는 다른 makefile에서 찾아야만 한다.
•
예를 들어, 대상 'foo'(및 기타 target)를 만드는 방법을 알려주는 Makefile이라는 makefile이 있는 경우, 다음을 포함하는 GNUmakefile이라는 makefile을 작성할 수 있습니다.
foo:
frobnicate > foo
%: force
@$(MAKE) -f Makefile $@
force: ;
Makefile
복사
•
'make foo'라고 말하면 make는 GNUmakefile을 찾아서 읽고 foo를 만들기 위해 'frobnicate > foo' 레시피를 실행해야 한다는 것을 확인합니다. 'make bar'라고 말하면 make는 GNUmakefile에서 bar를 만들 방법을 찾지 못하므로 'make -f Makefile bar'라는 패턴 규칙의 레시피를 사용합니다. Makefile가 bar 업데이트 규칙을 제공하는 경우 Makefile은 규칙을 적용합니다. 그리고 마찬가지로 GNUmakefile가 만드는 방법을 말하지 않는 다른 target들도 마찬가지입니다.
•
이것이 작동하는 방식은 패턴 규칙이 '%'의 패턴을 가지므로 모든 대상과 일치한다는 것입니다. 규칙은 대상 파일이 이미 존재하는 경우에도 레시피가 실행되도록 보장하기 위해 필수 조건을 지정합니다. 우리는 make가 빌드를 위한 암시적 규칙을 검색하지 못하도록 강제 대상에 빈 레시피를 제공합니다. 그렇지 않으면 동일한 일치 규칙을 적용하여 자체적으로 강제하고 전제 조건 루프를 생성합니다!