我正在使用autoconf
& automake
的C++項目,我正在努力正確設置*CPPFLAGS
中的包含路徑。我已經閱讀了大約3小時的文檔,我還沒有弄明白。我不是在尋找黑客,而是尋找正確的方法來做到這一點。這是我的難題。如何使用自動工具設置包含路徑
在我看來,有3個完全不同的用於源包括路徑:它必須與我的包,這是由configure --with-XXX=<PATH>
配置一起安裝
- 外部庫。
- 在我的軟件包中,有些源文件使用
#include <file.h>
,即使file.h
是軟件包的一部分,爲了編譯它們,我必須正確設置include路徑。 (注意,這不是編輯所有這些文件的選項。) - 異想天開(或不)標準指定用戶必須被允許指定他們自己的(額外的)包含路徑。也就是說,我不應該設置
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
?有沒有另一種「正確的」解決方案?
通過「異想天開」,你是否包含官方autoconf文檔,明確指出CPPFLAGS是一個用戶變量,不應該由維護者修改? (見http://www.gnu.org/software/autoconf/manual/autoconf.html上的第4.8.1節) –
儘管官方automake文檔中一個較不明確的例子可能會更清晰,其中指出:「你永遠不應該重新定義用戶變量,如Makefile.am中的CPPFLAGS「。在第27.6節的http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables-Ordering –