2011-09-19 48 views
3

假設我想讓生成makefile向g ++傳遞一些特定的頭文件路徑。使用autoconf/automake時,如何指定包含文件路徑?

我需要將什麼添加到configure.ac或Makefile.am中來指定它?

(注意 - 我不希望它的./configure傳入CPPFLAGS我想這一步之前出爐的這些路徑。)

編輯: 具體來說,我想包括我們說的/ usr/include/freetype和/ mypath/include。

我把AC_CHECK_HEADERS([freetype/config/ftheader.h]),它通過,但似乎並沒有將它添加到-I傳遞給g ++。我也嘗試添加CPPFLAGS = -I。:/ usr/include/freetype:/ mypath/include,但它擰緊並放置-I兩次,第一次作爲-I。它忽略了第二個 - 我。

+1

看起來這是錯誤的做法。 '。/ configure'是找出你正在編譯的系統上的東西的步驟,所以它也是允許編譯用戶告訴它頭文件路徑的非默認位置在哪裏的步驟。 – reinierpost

+1

CPPFLAGS不是冒號分隔列表。你想要CPPFLAGS =' - I/usr/include/freetype -I/mypath/include' –

回答

8

硬編碼路徑到包文件絕對是錯誤的做法。如果您選擇這樣做,那麼您需要意識到您違反了使用自動工具構建軟件包的基本規則。如果在軟件包文件中指定了/ mypath/include,則需要在適用於所有機器的軟件包中指定特定於您機器的東西;顯然這是錯誤的。它看起來像你想要的是爲你的包(當你的機器上構建時)在/ mypath中查找頭文件。這很容易完成,而不會混淆你的包裹。有(至少)3種方法:

1)使用config.site文件。在/usr/local/share/config.site(創建這個文件,如果有必要),添加一行:

 
CPPFLAGS="$CPPFLAGS -I/mypath/include" 

現在使用的autoconf任何包生成與默認前綴(在/ usr /本地)配置腳本將-I/mypath/include附加到CPPFLAGS,並找到/ mypath/include中的標頭。

2)如果您想對所有要進行的分配建立(不只是那些被安裝在/ usr /本地),您可以使用此:

把同一線上$ HOME指定CPPFLAGS/config.site,並在默認shell的環境中設置CONFIG_SITE = $ HOME/config.site。現在,無論何時運行autoconf生成的配置腳本,都將創建$ HOME/config.site中的任務。

3)只需在默認shell的環境中指定CPPFLAGS即可。

所有這些解決方案與修改構建文件相比有兩個主要優勢。首先,它們將適用於所有autoconf生成的軟件包(只要它們遵循規則,而不需要在構建文件中分配諸如CPPFLAGS之類的用戶變量)。其次,他們不會將機器的特定信息放入適用於所有機器的軟件包中。

+0

聽起來不錯,但是,...由configure生成的Makefile生成的編譯語句不引用環境CFLAGS或CPPFLAGS env變量。 – Cheeso

+0

如果包是使用automake構建的,則默認規則應該在適當的位置包含'$(CFLAGS)'和'$(CPPFLAGS)'。如果沒有,包維護者正在嚴重濫用automake。也許你正在看的包使用手工編寫的'Makefile.in'。 –

8

由於問題是關於如何放置在automake文件中,因此我認爲AM_CPPFLAGS是用於爲所有C/C++編譯添加include和定義的正確變量。見http://www.gnu.org/software/automake/manual/html_node/Program-Variables.html

例子:

AM_CPPFLAGS = -I/usr/local/custom/include/path 
+0

我同意這是對問題最直接的實際答案。只需在Makefile.am中添加一行,就可以爲構建目標指定自定義包含路徑。 – Tchakabam

相關問題