2013-05-31 37 views
1

是否有一種通用的做法是指定一個規則,用於從具有擴展名的內容到沒有擴展名的內容? (在這種情況下,'.in'到'')?Automake對於沒有擴展名的目標的默認規則?

我有一個使用automake的項目。我有一些配置文件模板在安裝之前需要替換。例如,我有一個'foo.ini.in'文件,我想用它來創建'foo.ini'。我有一些散佈在整個代碼庫中的。但是,對於每一個,我需要創建一個自定義的Makefile規則來使它們工作。有沒有更好的辦法?我目前做這Makefile.am:

bazdir=$(libdir)/@[email protected]/baz 

EXTRA_DIST = foo.ini.in bar.ini.in 
CLEANFILES = foo.ini bar.ini 

foo.ini: foo.ini.in 
    sed -e 's|@[email protected]|$(bazdir)|g' $< > [email protected] 

bar.ini: bar.ini.in 
    sed -e 's|@[email protected]|$(bazdir)|g' $< > [email protected] 

這工作得很好,但我需要複製每個文件的規則。我想寫一條規則,將任何'ini.in'文件替換爲'ini'文件。我試過了:

%.ini.in: %.ini 
    sed .... 

但autoconf抱怨%模式替換是不可移植的gnumake-ism。它也不喜歡

.ini.in.ini: 
    sed ..... 

..我真的不能指責它不喜歡,因爲我甚至不能解析它。

有沒有辦法做到這一點?

注意:我不能使用AC_CONFIG_FILES來做這個替換,因爲在這種情況下'bazdir'沒有完全展開。

+0

你能解釋一下爲什麼*'bazdir'不能完全展開?由於'$ libdir'和'$ PACKAGE_NAME'變量可以通過configure腳本來設置嗎? –

回答

2

幸運的是,還有一個很多更好的方法:讓使用配置腳本本身從模板生成'配置'的文件。正如我在評論中提到的,我沒有看到任何理由嘗試在Makefile.am本身中擴大$bazdir。也許你可以爲我清除這個,如果有這個特殊的原因。

configure.ac腳本中,用AC_SUBST宏定義替換變量。我猜你想用$bazdir的值代替LIBDIR。請注意0​​不是一個好名字的選擇,因爲libdir已經在配置腳本中使用;所以讓我們使用一個前綴爲項目名稱的變量名稱:BAZ_LIBDIR

1 /。在配置腳本中設置bazdirbazdir="${libdir}/${PACKAGE_NAME}/baz",並替換爲:AC_SUBST(BAZ_LIBDIR, $bazdir)。或者,只需將值分配給BAZ_LIBDIR並使用AC_SUBST的單參數形式。 BAZ_LIBDIR現在已準備好替代...

2 /。configure.ac的末尾,指定要從<file>.in模板生成的文件,並使用AC_CONFIG_FILES。通常這將列出Makefile以及數據文件,其中.in後綴是隱含的。

假設projectdir樹......可以是任何類型的課程的樹佈局:在<file>.ini.in文件@[email protected]

BAZ_LIBDIR="${libdir}/${PACKAGE_NAME}/baz" 
AC_SUBST(BAZ_LIBDIR) 
... 
AC_CONFIG_FILES([Makefile projectdir/Makefile]) 
AC_CONFIG_FILES([projectdir/foo.ini projectdir/bar.ini]) 
... 
AC_OUTPUT 

實例將替換值代替。不需要神祕的sed調用來生成<file>.ini文件。

另一個優點是,你不需要在Makefile.am添加foo.ini.inbar.ini.inEXTRA_DIST變量 - 和make distclean將清除bar.inifoo.ini文件。

+0

有趣。我更願意在目錄中保留對Makefile.am本地化的bazdir的定義(這是一個插件目錄,任何數量的人都會添加......已經抱怨項目使用Makefiles的人,更不用說autotools)。但是..我猜他們不會。呵呵。謝謝。 – clemej