Makeがランダムにファイルを上書きするのを防ぐ方法は?

Makeがランダムにファイルを上書きするのを防ぐ方法は?

私が空のディレクトリにあるとしましょう。all: randomFilename名前が空のファイルのみを含むMakefileを作成すると、GNU randomFilename.shMakeが呼び出された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;

>既存のファイルはオペレータによって上書きされません。

これはまだファイルを呼び出して生成できる他のプログラムには影響しません。

関連情報