Shell

Makefile 和 .ONESHELL

  • October 17, 2018

何時.ONESHELL不使用 Makefile 在單獨的 shell 中執行每個 shell 命令。這有什麼好處?為什麼 makefile 不使用相同的外殼?

一個原因是 GNU 不會檢測到配方命令之一的失敗make。只有 shell 的最終退出狀態會被提供給make. 必須另外設置.SHELLFLAGS-e讓 shell 在出現錯誤時提前終止(這對於多命令 shell 呼叫是必需的,即使.ONESHELL它們需要在第一個錯誤時失敗)。

SHELL當是 POSIX shell時,這一切都很好。Makefile 也可以設置SHELL為 eg/usr/bin/perl或其他一些命令解釋器。那麼,使用.ONESHELL.

使.ONESHELL預設行為make可能會破壞舊的 Makefile。

儘管這不是與 POSIX 標准或 GNU 對該標準的合規性有關的問題,但 POSIX 規範make基本原理對於手頭的問題有這樣的說法:make

某些高級版本的預設設置make是將目標的所有命令行分組並使用單個 shell 呼叫執行它們;System V 方法是將每一行單獨傳遞給單獨的外殼。單殼方法在性能上有優勢,不需要很多續行。但是,轉換為這種較新的方法會導致許多歷史 makefile 的可移植性問題,因此 POSIX makefile 的行為被指定為與 System V 的行為相同。建議使用特殊目標.ONESHELL作為實現擴展,實現對一個或一組目標的單shell分組。

GNUmake在這方面是 POSIX 兼容的,因為它實現了 System V 行為*,並*提供了一個.ONESHELL目標來啟用替代行為(如果需要)。make…這是 GNU保持目前行為的另一個原因。

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