私が空のディレクトリにあるとしましょう。all: randomFilename
名前が空のファイルのみを含むMakefileを作成すると、GNU randomFilename.sh
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;
>
既存のファイルはオペレータによって上書きされません。
これはまだファイルを呼び出して生成できる他のプログラムには影響しません。