2013-11-27 35 views
8

我正在使用autoconf & automake的C++項目,我正在努力正確設置*CPPFLAGS中的包含路徑。我已經閱讀了大約3小時的文檔,我還沒有弄明白。我不是在尋找黑客,而是尋找正確的方法來做到這一點。這是我的難題。如何使用自動工具設置包含路徑

在我看來,有3個完全不同的用於源包括路徑:它必須與我的包,這是由configure --with-XXX=<PATH>配置一起安裝

  1. 外部庫。
  2. 在我的軟件包中,有些源文件使用#include <file.h>,即使file.h是軟件包的一部分,爲了編譯它們,我必須正確設置include路徑。 (注意,這不是編輯所有這些文件的選項。)
  3. 異想天開(或不)標準指定用戶必須被允許指定他們自己的(額外的)包含路徑。也就是說,我不應該設置CPPFLAGS

在我的當前設置:

  • 類型1路徑由AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")設置內部configure.ac
  • 類型2路徑設置在Makefile.am之內test_CPPFLAGS = -I<path>
  • 無法設置類型3。更確切地說,如果用戶在運行make之前設置了CPPFLAGS,則會覆蓋類型1設置,導致編譯失敗。當然,用戶可以嘗試使用CXXFLAGS來代替,但該用戶有不同的用途(請記住,我正在尋求正確的方式來執行此操作,而不是黑客)。

我試圖通過在configure.ac內使用AM_CPPFLAGS設置類型1路徑來解決此問題。 (僅供參考:如果您設置了AM_CPPFLAGS而不是CPPFLAGS,但仍需要執行一些檢查,例如AC_CHECK_HEADERS,則需要暫時​​設置CPPFLAGS,然後將其恢復以便檢查生效;這是here的解釋。)這樣可以釋放CPPFLAGS對於類型3路徑,但不幸的是,編譯失敗,因爲configure產生的Makefile-s將只使用AM_CPPFLAGS,如果沒有專門的<target>_CPPFLAGS存在。因此,如果test_CPPFLAGS與類型2路徑一起存在,則編譯test將失敗,因爲它不會獲得類型1路徑。

修復方法是在Makefile.am之內指定始終使用AM_CPPFLAGS。但這是「靠書」嗎?我能以全局方式做到這一點,還是必須編輯每一個target_CPPFLAGS?有沒有另一種「正確的」解決方案?

+0

通過「異想天開」,你是否包含官方autoconf文檔,明確指出CPPFLAGS是一個用戶變量,不應該由維護者修​​改? (見http://www.gnu.org/software/autoconf/manual/autoconf.html上的第4.8.1節) –

+0

儘管官方automake文檔中一個較不明確的例子可能會更清晰,其中指出:「你永遠不應該重新定義用戶變量,如Makefile.am中的CPPFLAGS「。在第27.6節的http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables-Ordering –

回答

18

我知道很難從autotools手冊中得到直接的答案。有幾個很好的開始到結束教程herehere

autoconf中沒有針對特定軟件包*CPPFLAGS的標準變量。 configure可以用CPPFLAGS=...調用,automake會將這個CPPFLAGS添加到相關的生成文件規則中 - 例如在Makefile.in文件中搜索CPPFLAGS。出於這個原因,我建議你而不是使用這個變量的任何其他。

Makefile.am中的標誌添加到AM_CPPFLAGS變量(所有預處理程序調用的缺省值)或使用target_CPPFLAGS覆蓋單個預處理器標誌。在第三方庫的例子,最好使用一個名稱,如:FOO_CPPFLAGS舉行預處理器的選項,例如,

FOO_CPPFLAGS="-I${FOO_DIR}/include -DFOO_BAR=1" 
... 
AC_SUBST(FOO_CPPFLAGS) 

,並在Makefile.am

AM_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS) 
# or: 
target_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS) 

top_srcdir變量由configure - 我用它來說明第二種情況。假設您在頂級目錄下的另一個目錄other中有file.h-I$(top_srcdir)可讓您將其包含爲<other/file.h>。或者,-I$(top_srcdir)/other將允許您將其包括爲<file.h>

另一個有用的preset variablesrcdir - 當前目錄。 -I$(srcdir)默認添加到AM_CPPFLAGS。因此,如果file.h在當前目錄中,您可以使用<file.h>甚至"file.h"來包含它。如果other是「兄弟」目錄,則-I$(srcdir)/..將允許您包含<other/file.h>,而-I$(srcdir)/../other將允許<file.h>


我還補充說,一些軟件包會安裝一個pkg-config .pc文件。如果安裝pkg-config設置爲搜索正確的目錄,則可能會發現PKG_CHECK_MODULES宏非常有用。

+2

另一個是'$(builddir)'或'$(top_builddir) '這顯然意味着用於構建期間生成的任何文件。 – CMCDragonkai

相關問題