[英]Confused about configure script and Makefile.in
我目前正在學習如何使用autoconf
/ automake
工具鏈。 我似乎對這里的工作流程有一個大致的了解 - 基本上你有一個configure.ac
腳本,它生成一個可執行的configure
文件。 生成的configure
腳本然后由最終用戶執行以生成Makefile
,因此可以構建/安裝程序。
因此,典型最終用戶的安裝基本上是:
./configure
make
make install
make clean
好的,現在這是我感到困惑的地方:
作為開發人員,我注意到自動生成的配置腳本有時無法運行,並且會出現以下錯誤:
config.status: error: cannot find input file: `somedir/Makefile.in'
這讓我很困惑,因為我認為配置腳本應該生成Makefile.in
。 因此,在谷歌上搜索一些答案,我發現這可以通過autogen.sh
腳本來解決,該腳本基本上“重置”了autoconf
環境的狀態。 典型的autogen.sh
腳本類似於:
aclocal \
&& automake --add-missing \
&& autoconf
好的。 但作為一個終生下載無數 tarball 的最終用戶,我從未使用過autogen.sh
腳本。 我所做的只是解壓縮 tarball,然后執行通常的 configure/make/make install/make clean 例程。
但是作為現在使用autoconf
的開發人員,除非您先運行autogen.sh
否則configure
實際上不會運行。 所以我覺得這很令人困惑,因為我認為最終用戶不應該運行autogen.sh
。
那么為什么我必須先運行autogen.sh
- 為了讓配置腳本找到Makefile.in
? 為什么配置腳本不簡單地生成它?
為了真正理解 autotools 實用程序,您必須記住它們來自哪里:它們來自一個開源世界,其中有 (a) 開發人員在源代碼存儲庫(CVS、Git 等)中工作並創建一個tar 文件或包含源代碼的類似文件並將該 tar 文件放在下載站點上,以及 (b) 獲取源代碼 tar 文件、在其系統上編譯該源代碼並使用生成的二進制文件的最終用戶。 顯然,(a) 組的人也編譯代碼並使用生成的二進制文件,但 (b) 組的人通常沒有或不需要 (a) 組的人需要的所有開發工具。
因此,工具的使用是針對這種分裂的,即組 (b) 中的人無法訪問 autoconf、automake 等。
使用autoconf時,人們通常將configure.ac
文件(autoconf的輸入)簽入源代碼管理,但不簽入autoconf的輸出, configure
腳本(當然有些項目確實簽入了configure
腳本:這取決於你)。
使用 automake 時,人們通常檢查Makefile.am
文件(automake 的輸入)但不檢查 automake 的輸出: Makefile.in
。
configure
腳本基本上會在您的系統中查看包可能需要或不需要的各種可選元素,可以在何處找到它們等。一旦找到此信息,它就可以使用它來轉換各種XXX.in
文件(通常,但不僅僅是Makefile.in
) 到XXX
文件(例如Makefile
)。
所以步驟通常是這樣的:寫configure.ac
和Makefile.am
,並檢查他們要建立從源代碼控制檢出的項目,以使autoconf去生成。 configure
從configure.ac
。 運行Automake生成Makefile.in
從Makefile.am
。 運行configure生成Makefile
從Makefile.in
。 運行 make 來構建產品。
當你想發布源代碼時(如果你正在開發一個發布源代碼的開源產品),你運行 autoconf 和 automake,然后將源代碼與configure
和Makefile.in
文件捆綁在一起,以便人們構建你的源代碼發布只需要 make 和編譯器,不需要任何自動工具。
因為運行 autoconf 和 automake(和 libtool,如果你使用它)的順序可能很棘手,所以有像 autogen.sh 和 autoreconf 等腳本,它們被簽入源代碼管理,供開發人員從源代碼管理中使用,但這些是從源代碼發布 tar 文件等構建的人不需要/使用。
Autoconf 和 automake 通常一起使用,但如果您想編寫自己的Makefile.in
,則可以使用 autoconf 而不使用 automake。
對於這個錯誤:
config.status: error: cannot find input file: `somedir/Makefile.in'
在Makefile.am中configure.ac所在目錄添加一行,子目錄somedir
SUBDIRS = somedir
在somedir
里面放一個包含所有描述的Makefile.am
。 然后運行automaker --add-missing
更好的描述可以在 7.1 Recursing subdirectories automake manual 中找到。 https://www.gnu.org/software/automake/manual/automake.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.