Make
如何防止 Make 隨機覆蓋文件?
假設我在一個空目錄中。如果我現在創建一個 Makefile 只包含
all: randomFilename
一個名為 的空文件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
更糟糕的是,Make 會覆蓋一個名為 的文件
randomFilename
,如果它已經存在的話。$ 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 這樣做的原因以及防止這種行為的方法。
此行為是 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.
您描述的行為不依賴於 make 程序,而是依賴於 shell。
如果你有一個 POSIX shell 並且你讓 makefile 中的每個命令行都以:
set -o noclobber;
現有文件將不再被
>
操作員覆蓋。請注意,這仍然不會影響可能被呼叫和創建文件的其他程序。