2011-11-25 47 views
1

某些應用程序包含駐留在/ usr/libexec中的主應用程序運行的腳本。但是,autoconf腳本可以通過將--libexecdir傳遞給配置腳本來更改該目錄。從編譯器將目錄傳遞給C++應用程序

例如,在運行./configure中的git源代碼時,我可以將--libexecdir設置爲我想要的任何目錄,程序仍然可以工作。

我需要添加到C++才能使此功能有效嗎?換句話說,我怎樣才能將一個由配置腳本設置的目錄名稱編譯到程序中?

回答

2

您需要將@[email protected]替代變量(例如用於Makefile.in)的值暴露給您的C++代碼。要做到這一點,最簡單,最可靠的方法是用對象文件編譯器命令行上一個-D交換機需要知道:

foo.o: CPPFLAGS += -DLIBEXECDIR='"$(libexecdir)"' 

foo.ccLIBEXECDIR屆時將預處理宏擴展到字符串常量那有你需要的路徑。但有兩點需要注意:上面的Makefile代碼片段使用了GNU make功能,target-specific variables。它在其他Make實現中不起作用。另外,我並沒有在$(libexecdir)的擴展中引用任何字符。完全防禦報價會是這個樣子:

foo.o: CPPFLAGS += \ 
    -DLIBEXECDIR='"$(subst ",\",$(subst ','\'',$(subst \,\\,$(libexecdir))))"' 

你一定會需要至少最裏面的$(subst ...)構建,如果你希望能夠使用Windows路徑名,用斜槓走錯了路。人們通常不會把的路徑名,所以我可能不會與外側的兩個打擾,直到有人抱怨。

同樣的技術將對於是不是也是任何@[email protected]替代變量工作一個AC_DEFINE


你可能會認爲你可以使用AC_DEFINE_UNQUOTED以某種方式獲得的$(libexecdir)價值爲config.h,從而避免這一切的命令行各地搞混。不幸的是,Autoconf的不完全計算的值,其@*[email protected]個換人在配置時:

# near the top of the generated 'configure': 
exec_prefix=NONE 
libexecdir='${exec_prefix}/libexec' 

# much, much later -- as part of AC_OUTPUT: 
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' 

因此,如果你有AC_DEFINE_UNQUOTED做明顯的事情,你會得到類似

#define LIBEXECDIR "${exec_prefix}/libexec" 
在你的config.h

。所以這是行不通的,我看不到一個好的方法來使它工作。

+0

謝謝你的回答!這很清楚! –

相關問題