2012-03-11 74 views
1

我們使用automake & autoconf來構建我們的多軟件包軟件。我想知道如何用例如輸出來填充一個變量。 shell腳本一次並重新使用,例如對於需要include目錄僅評估automake變量一次

INCLUDES := -I`some-ext-config --incdir` 

使用的:=代替=這裏使這個變量填寫一次,以便將some-ext-config只被調用一次(據我所知這是來自普通make)。當然INCLUDESAM_CPPFLAGS的折舊表弟,但是我是否會使用那個表示腳本,因此每個編譯都會調用shell腳本。

使用INCLUDES而不是AM_CPPFLAGS對我來說是一個可接受的解決方案(雖然我想可能存在可移植性問題),但我沒有解決方案。 LDFLAGS了libtool的庫

libmylib_la_LDFLAGS := `some-ext-config --ldflags` # will always be evaluated 

裏面是什麼automake一般的解決辦法,如果我要確保這些外部工具不能調用多次?我想遠離在configure.ac中使用明顯的AC_SUBST,因爲我們必須確保我們的軟件包可以從子目錄(在那裏有一些configure.ac)和從頂級遞歸make和configure.ac那裏生成,不需要太多瞭解不同的子項目。

回答

2

:=是GNU制定的,因此建議您在automake中只使用=。如果您不想每次運行shell腳本INCLUDES(或AM_CPPFLAGS,無關緊要,都會發生),然後在configure.ac中運行腳本並通過AC_SUBST使用變量替換。這基本上就是pkg-config會做的 - 並且說到這一點,如果有.pc文件,您可以使用它而不是某些-ext-config。

# configure.ac 
libfoo_CPPFLAGS=$(some-ext-config --incdir); 
libfoo_LIBS=$(some-ext-config --libs); 
AC_SUBST([libfoo_CPPFLAGS]) 
AC_SUBST([libfoo_LIBS]) 

# Makefile.am 
AM_CPPFLAGS = -Iwhatever ${libfoo_CPPFLAGS} 
bin_PROGRAMS = foo 
foo_LDADD = ${libfoo_LIBS} 
+0

嗯,我寫了,我想遠離將它放到'configure.ac'中出於某些外部原因。 – 2012-03-11 22:48:54

+1

@honk:那麼您將不得不解決這些外部原因(例如使用'AC_CONFIG_SUBDIRS')或放棄編寫便攜式Makefiles。 – adl 2012-03-12 07:30:26

+0

外部原因是我們希望能夠在頂層Makefile.am文件中爲子目錄Makefile添加AC_OUTPUT,但不需要在每個子目錄中調用configure,只要我們的構建)。我們只需要可移植到GNU make,我是否正確理解沒有辦法只填充一次這些automake變量? – 2012-03-12 12:11:05

0

這是一個更長的解釋,我對jørgensen的回答發表了評論意見。

我理解你的頂級configure.ac必須生成多個子項目的生成文件,並進行必要的測試,這樣你就不必在任意子項目configure(一子configure只有當你想要走秀在這個特定的子項目上工作)。

在這種情況下,您希望避免從各種configure.ac中儘可能多地重複儘可能多的東西。我建議你考慮所有configure的代碼,這些代碼也必須由宏中的頂級configure執行。這包括測試,AC_SUBSTSMakefile聲明。

例如只使用一個子項目。這裏是一個頂級./configure.ac

AC_INIT([toplevel], [1.0]) 
AM_INIT_AUTOMAKE([foreign -Werror]) 
SUB1_COMMON([sub1/]) dnl Stuff from the subproject 
AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

隨着./Makefile.am

ACLOCAL_AMFLAGS = -I sub1/m4 
SUBDIRS = sub1 

現在這裏是sub1/configure.ac的子項目:

AC_INIT([sub1], [1.0]) 
AM_INIT_AUTOMAKE([foreign -Werror]) 
AC_CONFIG_MACRO_DIR([m4]) 
SUB1_COMMON 
AC_OUTPUT 

隨着SUB1_COMMONm4/common.m4定義:

AC_DEFUN([SUB1_COMMON], 
    [AC_SUBST([PYTHON3LIB], [`pkg-config --libs python3`]) 
    AC_CONFIG_FILES([$1Makefile])]) 

最後sub1/Makefile.am就是:

ACLOCAL_AMFLAGS = -I m4 
# Build something. 
... 

SUB1_COMMON包含所有你希望兩個configure.ac文件之間共享,並使用參數$1適當地重新定位配置文件的代碼。在此示例中,將定義變量PYTHON3LIB,而不管運行哪個configure