내가 빈 디렉토리에 있다고 가정해 봅시다. 이제 all: randomFilename
이름이 빈 파일 만 포함하는 Makefile을 생성하면 randomFilename.sh
GNU Make가 cat randomFilename.sh >randomFilename; chmod a+x randomFilename
호출될 때 실행됩니다.make
$ echo 'all: randomFilename' > Makefile
$ make
make: *** No rule to make target 'randomFilename', needed by 'all'. Stop.
$ touch randomFilename.sh
$ make
cat randomFilename.sh >randomFilename
chmod a+x randomFilename
$ make -v | head -n2
GNU Make 4.0
Built for x86_64-pc-linux-gnu
randomFilename
더 나쁜 것은 Make가 이미 존재하는 경우 이름이 지정된 파일을 덮어쓰게 된다는 것입니다 .
$ echo "My content" > randomFilename
$ echo "My content, all gone" > randomFilename.sh
$ make -B
cat randomFilename.sh >randomFilename
chmod a+x randomFilename
$ cat randomFilename
My content, all gone
나는 Make가 이런 일을 하는 이유와 이런 행동을 방지하는 방법을 찾고 싶습니다.
답변1
이 동작은 Make의 내장 접미사 규칙(이 경우 이전 버전의 소스 제어 시스템 [1]). 내장된 접미사 규칙은 빈 .SUFFIXES
의사 대상 [을 지정하여 비활성화할 수 있습니다 .2]:
$ echo '.SUFFIXES:' > Makefile
$ echo 'all: randomFilename' >> Makefile
$ make
make: *** No rule to make target 'randomFilename', needed by 'all'. Stop.
$ touch randomFilename.sh
$ make
make: *** No rule to make target 'randomFilename', needed by 'all'. Stop.
답변2
설명하는 동작은 make 프로그램이 아니라 쉘에 따라 다릅니다.
POSIX 쉘이 있고 makefile의 모든 명령줄이 다음으로 시작되는 경우:
set -o noclobber;
>
기존 파일은 더 이상 운영자가 덮어쓰지 않습니다 .
이는 여전히 파일을 호출하고 생성할 수 있는 다른 프로그램에는 영향을 미치지 않습니다.