Make

如何防止 Make 隨機覆蓋文件?

  • May 27, 2018

假設我在一個空目錄中。如果我現在創建一個 Makefile 只包含all: randomFilename一個名為 的空文件randomFilename.sh,那麼 GNU Make 將cat randomFilename.sh >randomFilename; chmod a+x randomFilenamemake被呼叫時執行。

$ 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;

現有文件將不再被>操作員覆蓋。

請注意,這仍然不會影響可能被呼叫和創建文件的其他程序。

引用自:https://unix.stackexchange.com/questions/234010