나는 다음을 가지고 있습니다 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
기본적으로 예제에 지정된 첫 번째 대상을 올바르게 선택하고 있습니까 ?Makefile
all
답변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
또한foo
makefile에 의해 생성되지 않으므로 항상 사용되지 않는 것으로 간주됩니다.foo
makefile의 관점에서 "생성"되는bar
시점에 따라 더미 명령이 실행됩니다. 하지만 이름이 지정되지 않은 .so 도 항상 쓸모 없는 것으로 간주됩니다.foo
true
foo
foo
bar
makefile의 관점에서 "생성"되는file.txt
시점과 시점 에 따라 명령이 실행됩니다. 이렇게 하면 파일이 존재하는 경우 해당 파일이 더 최신 상태가 되며, 더 이상 현재보다 젊지 않기 때문에 해당 파일을 더 이상 사용되지 않게 됩니다 .bar
touch file.txt
file.txt
bar
bar
file.txt
bar
file.txt
가장 최근 명령을
file.txt
명령으로 만드는 것은echo
아무런 영향을 미치지 않지만file.txt
모든make
구현은 특별한 날짜를 가정하기 때문에어떤 문서보다 젊다(대상 파일의 실제 존재나 타임스탬프를 확인하지 않고) 이로 인해 대상 명령을 실행한 후 실행이 실패하지 않습니다make
.
file.txt
따라서 귀하의 makefile은 규칙에 따라 만들거나 다시 만들지 않습니다 file.txt
.
반면, 귀하의 makefile
작품은 예상 처리 시간 file.txt
에 비해 최신 버전이 아닙니다 . 이에 따라 달라질 수 있습니다 .bar
bar
bar
file.txt
나는 그것이 어떻게 작동하는지 이해하기 위해 더 간단한 makefile로 시작하는 것을 제안합니다 make
.