2011-05-03 67 views
13

我的程序需要加載在運行時的一些文件,這些文件將被安裝到任何文件夾作爲我的程序需要知道這個文件夾是給./configure --datadir=/somewhere的Autoconf:如何獲得安裝路徑進入的config.h

在運行時,我需要在某處定義一個符號,以便C代碼可以以字符串的形式訪問該路徑。

我目前通過修改編譯器標誌這樣做:

AM_CPPFLAGS = -DDATA_PATH=\"$(pkgdatadir)\" 

然而,由於配置腳本已經產生的config.h文件和一幫在裏面其他的東西,我想有符號而是出現在那裏。

這可能嗎?

回答

4
AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"]) 

儘管修改編譯器標誌實際上是更常用的方法。

+0

謝謝!按照「通常」的方式是否有任何好處?我都是爲了保持標準,但它似乎更加混亂。 – Malvineous 2011-05-04 00:44:33

+0

的好處是你可以在配置時通過'./configure CPPFLAGS = -DDATA_PATH =/path/to/alternate/data'覆蓋CPPFLAGS;使用config.h來執行它需要'./configure --prefix =/alternate/prefix',這樣可以減少對各個目錄位置的控制。 – ptomato 2011-05-04 08:51:10

6

您的解決方案是正確的。 Autoconf/Automake不支持(容易地)將安裝路徑放入config.h的原因是理論上你應該能夠在構建時覆蓋路徑,例如make prefix=/else/where。這種可能性現在有點神祕,但這就是原因。 (請注意,這與make install prefix=/else/where/不同,儘管DESTDIR仍然有用,但它仍然有用。)

6

您的答案是執行此操作的首選方式。 autoconf手冊介紹瞭如何在「make install」時間覆蓋各種變量(例如,這對打包非常有用)。在這樣做時,它說(參見「安裝目錄變量):

A corollary is that you should not use these variables except in 
makefiles. For instance, instead of trying to evaluate `datadir' in 
`configure' and hard-coding it in makefiles using e.g., 
`AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you 
should add `-DDATADIR='$(datadir)'' to your makefile's definition of 
`CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake). 

自動工具,和一般的構建系統,是一個令人費解的業務和還沒有人想出做的事情是漂亮和整潔的方式一般情況下,這意味着我們必須閱讀這樣的部分並完全解決這個問題,無論如何,你的直覺是正確的!

1

如果你有一系列必須被你知道的這樣的路徑源代碼,並且您希望避免在編譯時出現過多噪音(例如-DPATH1 =/path/to/something -DPATH2 =/path2/to/something2 -DPATH3 =/path3/to/something3 ... ad infinitum),對某些人來說可能需要的替代方法是創建一個新的 「mynewheader.h.in」,用線

#define PATH1 "@[email protected]" 
#define PATH2 "@[email protected]" 
#define PATH3 "@[email protected]" 

,並把它添加到你的configure.ac的AC_CONFIG_FILES線,如:

AC_CONFIG_FILES([Makefile mynewheader.h])