GNU make의 실행 프로세스 이해

GNU make의 실행 프로세스 이해

나는 다음을 가지고 있습니다 Makefile:

$ cat Makefile
all: foo

foo: bar
        @true

bar: file.txt
        touch file.txt

file.txt:
        @echo 'Created file.txt'

run:
        @echo 'Target without dependency.'
$

을 실행하면 make이미 touch file.txt존재하더라도 항상 실행됩니다. 왜 이런 일이 발생합니까? bar종속성이 충족되면(즉, 존재하는 경우) 대상이 실행될 것으로 예상하지 않습니다 file.txt. 또한 make기본적으로 예제에 지정된 첫 번째 대상을 올바르게 선택하고 있습니까 ?Makefileall

답변1

첫째, make는 명령이 수행하는 작업에는 관심이 없습니다. 명령이 수행하는 작업에만 관심이 있습니다. 단지 그것들을 쉘에 전달합니다.

둘째, bar파일을 생성한 적이 file.txt없으므로언제나newer 보다 bar규칙 bar: file.txt이 일치하고 touch file.txt명령이 실행됩니다.

당연히 를 대상으로 하는 file.txt규칙을 만지거나 만들어야 합니다.file.txt

또한 make가 기본적으로 Makefile의 첫 번째 대상(예제에서는 all로 명명됨)을 선택한다는 것이 맞습니까?

예.

답변2

Makefile비표준 기능을 사용하지 않으므로 귀하의 질문은 GNU make에만 국한되지 않습니다 .

  • makefile의 첫 번째 일반 대상은 다음과 같습니다.모두, 소위 기본 대상이 됩니다.

  • "all"이름이 지정된 파일이 파일 시스템에 존재하지 않고 makefile이 파일을 생성하지 않는다고 가정하고 있기 때문에 이는 all항상 쓸모 없는 것으로 간주되는 의사 대상으로 간주될 수 있습니다.

  • all또한 foomakefile에 의해 생성되지 않으므로 항상 사용되지 않는 것으로 간주됩니다.

  • foomakefile의 관점에서 "생성"되는 bar시점에 따라 더미 명령이 실행됩니다. 하지만 이름이 지정되지 않은 .so 도 항상 쓸모 없는 것으로 간주됩니다.footruefoofoo

  • barmakefile의 관점에서 "생성"되는 file.txt시점과 시점 에 따라 명령이 실행됩니다. 이렇게 하면 파일이 존재하는 경우 해당 파일이 더 최신 상태가 되며, 더 이상 현재보다 젊지 않기 때문에 해당 파일을 더 이상 사용되지 않게 됩니다 .bartouch file.txtfile.txtbarbarfile.txtbarfile.txt

  • 가장 최근 명령을 file.txt명령으로 만드는 것은 echo아무런 영향을 미치지 않지만 file.txt모든 make구현은 특별한 날짜를 가정하기 때문에어떤 문서보다 젊다(대상 파일의 실제 존재나 타임스탬프를 확인하지 않고) 이로 인해 대상 명령을 실행한 후 실행이 실패하지 않습니다 make.

file.txt따라서 귀하의 makefile은 규칙에 따라 만들거나 다시 만들지 않습니다 file.txt.

반면, 귀하의 makefile작품은 예상 처리 시간 file.txt에 비해 최신 버전이 아닙니다 . 이에 따라 달라질 수 있습니다 .barbarbarfile.txt

나는 그것이 어떻게 작동하는지 이해하기 위해 더 간단한 makefile로 시작하는 것을 제안합니다 make.

관련 정보