當我運行./configure時,它有時會判定它已經太舊,並且通過缺少的腳本重新運行autoconf以重新生成自己。有時它會導致奇怪的破損,因爲自動配置 目標機器比舊版autoconf最初用於生成配置。配置腳本如何決定自己重新生成
我想知道它是如何發現它太舊?有配置的標準方式來做到這一點?或者取決於圖書館。指向文檔將不勝感激 。
當我運行./configure時,它有時會判定它已經太舊,並且通過缺少的腳本重新運行autoconf以重新生成自己。有時它會導致奇怪的破損,因爲自動配置 目標機器比舊版autoconf最初用於生成配置。配置腳本如何決定自己重新生成
我想知道它是如何發現它太舊?有配置的標準方式來做到這一點?或者取決於圖書館。指向文檔將不勝感激 。
configure
不認爲這個:make
呢。如果configure
腳本早於configure.ac
或其包含的任何文件(以aclocal.m4
開頭),則make
將運行autoconf
以重建configure
。
存在類似的規則來重建aclocal.m4
使用aclocal
,以及各種Makefile.in
使用automake
。
因爲tarball中所有這些文件的時間戳應該是正確的(configure
等比configure.ac
等新),所以在解壓tarball到目標機器之後,永遠不應觸發這些重建規則。所以如果發生這種情況,你的壓縮包中有一些是僞造的(比如你沒有使用make dist
或者最好是make distcheck
來生成它),或者編譯源代碼的用戶做了錯誤的事情(比如複製整個目錄而不保留時間戳),或者目標系統中有一些虛假信息(例如,如果NFS服務器的時鐘與客戶端的時鐘不同步,則make
通常無法在NFS安裝的目錄上正常工作)。
保留生成的文件在版本控制系統中的人會觀察到不受歡迎的重建的另一個常見來源。如果這是您的情況,請參閱http://sourceware.org/automake/automake.html#CVS以獲得有關此問題的討論。
我會搶先增加'AM_MAINTAINER_MODE'不是一個解決方案。它只是增加了可能發生破損的另一點。不要在源代碼控制中保存生成的文件,並使用'make distcheck'來編譯tarball,你應該沒問題。 – 2010-11-08 20:36:51
罪魁禍首最終成爲git,因爲它不保存時間戳configure.ac被檢出爲更新,然後配置。需要研究爲什麼我們要將生成的文件保存在源代碼控制之下。 – KiRPiCH 2010-11-09 18:14:35
@KiRPiCH:還要注意,使用現代的'automake',通常可以從'configure.ac' +'Makefile.am'通過運行'autoreconf -i'將所有內容準備好到'./configure'。無需擔心運行'aclocal','autoconf','autoheader','automake','libtoolize'和其他任何正確的順序。如果這還不夠,那麼創建一個名爲'bootstrap.sh'的腳本('autogen.sh'是另一個通用名稱,但有一個叫做'autogen'的晦澀工具)以正確的順序運行自動工具。 – 2010-11-09 19:36:59