Make가 임의로 파일을 덮어쓰는 것을 방지하는 방법은 무엇입니까?

Make가 임의로 파일을 덮어쓰는 것을 방지하는 방법은 무엇입니까?

내가 빈 디렉토리에 있다고 가정해 봅시다. 이제 all: randomFilename이름이 빈 파일 만 포함하는 Makefile을 생성하면 randomFilename.shGNU 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;

>기존 파일은 더 이상 운영자가 덮어쓰지 않습니다 .

이는 여전히 파일을 호출하고 생성할 수 있는 다른 프로그램에는 영향을 미치지 않습니다.

관련 정보