automake 和 autoconf 是編譯程式碼的標準方法嗎?

automake 和 autoconf 是編譯程式碼的標準方法嗎?

我有時從源代碼編譯應用程序,並且我一直在使用:

./configure
make
sudo make install

但最近,我發現./autogen.sh它為我產生配置和製作腳本並執行它們。

還有哪些方法可以簡化 C/C++/C#(mono) 編譯?看起來有點老了。有新的工具嗎?如果可以選擇,我應該使用哪一個?

答案1

Autoconf 和 utomake 旨在解決 Unix 的演化問題。

隨著 Unix 向不同方向發展,想要可移植程式碼的開發人員傾向於編寫如下程式碼:

#if RUNNING_ON_BSD
Set things up in the BSD way
#if RUNNING_ON_SYSTEMV
Set things up in the SystemV way
#endif

隨著Unix 被分叉成不同的實作(BSD、SystemV、許多供應商分叉,以及後來的Linux 和其他類Unix 系統),對於想要編寫可移植程式碼來編寫不依賴特定作業系統品牌的程式碼的開發人員來說變得很重要,但基於作業系統公開的功能。這很重要,因為 Unix 版本會引入新功能,例如「發送」系統調用,後來其他作業系統也會採用它。開發人員不再使用大量程式碼來檢查品牌和版本,而是開始按功能進行探索,因此程式碼變成了:

#if HAVE_SEND
Use Send here
#else
Use something else
#endif

大多數 90 年代編譯原始碼的自述文件都指示開發人員編輯 config.h 檔案並註解掉系統上可用的適當功能,或為每個已測試的作業系統配置提供標準 config.h 檔案。

這個過程既麻煩又容易出錯,這就是 Autoconf 的由來。您應該將 Autoconf 視為一種由具有特殊巨集的 shell 命令組成的語言,它能夠使用探測作業系統功能的工具來取代 config.h 的人工編輯過程。

您通常會將偵測程式碼寫入configure.ac 檔案中,然後執行autoconf 命令,會將此檔案編譯為您所使用過的可執行configure 命令。

因此,當您執行時,./configure && make您正在探測系統上可用的功能,然後使用偵測到的組態建置可執行檔。

當開源專案開始使用原始碼控制系統時,簽入configure.ac 檔案是有意義的,但簽入編譯(configure)的結果卻沒有意義。 autogen.sh 只是一個小腳本,它使用正確的命令參數來呼叫 autoconf 編譯器。

--

Automake 也源自於社群現有的實踐。 GNU 專案標準化了 Makefile 的一組常規目標:

  • make all將建構該項目
  • make clean將從專案中刪除所有已編譯的文件
  • make install會安裝軟體
  • 類似的事情make distmake distcheck準備要分發的源代碼並驗證結果是否是完整的源代碼包
  • 等等...

建立相容的 makefile 變得很麻煩,因為有大量的樣板檔案被一遍又一遍地重複。因此,Automake 是一個新的編譯器,它與 autoconf 集成,並將「來源」Makefile(名為 Makefile.am)處理為 Makefile,然後將其提供給 Autoconf。

automake/autoconf 工具鏈實際上使用了許多其他輔助工具,並且透過其他元件來增強它們以執行其他特定任務。隨著按順序運行這些命令的複雜性不斷增加,對可立即運行的腳本的需求誕生了,這就是 autogen.sh 的由來。

據我所知,Gnome 是引入此幫助程式腳本 autogen.sh 的使用的項目

答案2

這個領域有兩個「大玩家」; Cmake 和 GNU Autotools。

  • GNU Autotools 是 GNU 做事的方式,並且相當關注 *nix。它是一種元構建系統,提供了一組工具來產生特定的配置並為您想要執行的操作建立檔案。這可以幫助您在程式碼中進行更多更改,而無需直接操作建置系統,並且可以幫助其他人以您未設計的方式建立您的程式碼 - 在 *nix 下。

  • Cmake 是跨平台的做事方式。 Cmake 團隊以許多不同的方式建構軟體,包括 GCC、Visual Studio、XCode、Windows、OSX、Solaris、BSD、GNU/Linux 等。如果您非常關心程式碼庫的可移植性,那麼這就是正確的選擇。

正如已經提到的,有些人似乎喜歡 Scons。如果您熟悉 Python,這可能會為您的工作環境提供更多的一致性。

Ruby 還有一種稱為 Rake 的元構建系統,它本身就非常酷,對於已經熟悉 Ruby 的人來說非常方便。

答案3

斯康斯是一種可能的替代品,儘管我沒有個人經驗。它也是用 Python 實現的,這可能是一個問題,這取決於建置環境。

答案4

對於 C#,您可以使用 xbuild(以及 Windows 上的 msbuild),它將從您的專案檔案建立專案。

相關內容