2012-03-11 4 views
1

automake & autoconfを使用して、マルチパッケージソフトウェアを構築しています。私はどのように出力変数で変数を埋めるのかと思いました。シェルスクリプトを一回使用して再利用します。必要なため、ここで:=の代わり=を使用してdirsにautomake変数を1回だけ評価する

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

を含め、この変数は一度埋めますのでsome-ext-configは(私の知る限り、これは平野makeから来ている)を1回呼び出されます。もちろんINCLUDESは減価償却された従兄弟AM_CPPFLAGSですが、私はその代わりにシェルスクリプトを呼び出すようにしました。

AM_CPPFLAGSの代わりにINCLUDESを使用すると、(私は移植性の問題があるとは思いますが)私には受け入れられる解決策ですが、私は解決策がありません。私はこれらの外部ツールが複数回呼び出されていないことを確認したい場合は、libtoolライブラリのためのLDFLAGSは

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

automake内部の一般的な解決策は何ですか?私たちのパッケージがサブディレクトリ(そこにはconfigure.acである)とトップレベルからの再帰的なmakeとそこにあるconfigure.acの両方からビルドできることを確認しなければならないので、に明白なAC_SUBSTを使用しないようにしたいと思います。異なるサブプロジェクトについてあまり知っている必要はありません。

答えて

2

:=はGNU-make固有のものなので、automakeでちょうど=を使用することをお勧めします。 INCLUDES(またはAM_CPPFLAGSは問題ではありません)のたびにシェルスクリプトを実行したくない場合は、configure.acでスクリプトを実行し、AC_SUBSTで変数置換を使用します。これは本質的にpkg-configがやることです - それについて話をすると、.pcファイルがあればsome-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'にいくつかの外部の理由で入れておきたいと書いています。 –

+1

@honk:これらの外部的な理由(例えば 'AC_CONFIG_SUBDIRS'を使う)を修正したり、移植可能なMakefileを書き留めたりする必要があります。 – adl

+0

外部の理由は、最下位の 'Makefile.am'のサブディレクトリ' Makefile'sに 'AC_OUTPUT'を追加するだけで、各サブディレクトリ('限り私たちのビルド)。私たちはGNU makeに移植する必要があるだけですが、これらのautomake変数を一度しか埋める方法がないことを正しく理解していますか? –

0

これは、私がjørgensenの答えに対するコメントで提案したものの、もっと長い説明です。

私はあなたのトップレベルconfigure.acは、複数のサブプロジェクトのmakefileを生成し、あなたが任意のサブプロジェクトでconfigureを実行する必要がないように必要なテストを実行しなければなりません(サブconfigureが希望する場合にのみ機能します理解この特定のサブプロジェクトで作業する)。

この場合、さまざまなconfigure.acからできるだけ多くのものを複製する必要はありません。 configureのすべてのコードを考慮してください。configureのマクロで実行する必要があります。これには、テスト、AC_SUBSTS、およびMakefileの宣言が含まれます。

たとえば、1つのサブプロジェクトのみを使用します。今ここに

ACLOCAL_AMFLAGS = -I sub1/m4 
SUBDIRS = sub1 

サブプロジェクトのsub1/configure.ac次のとおりです:

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

:ここではトップレベルの./configure.acある

m4/common.m4で定義されて SUB1_COMMON
AC_INIT([sub1], [1.0]) 
AM_INIT_AUTOMAKE([foreign -Werror]) 
AC_CONFIG_MACRO_DIR([m4]) 
SUB1_COMMON 
AC_OUTPUT 

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は、2つのconfigure.acファイル間で共有したいすべてのコードが含まれており、適切に設定ファイルを再配置するために、引数$1を使用しています。この例では、変数PYTHON3LIBは、実行されたものに関係なく定義されます。configure

関連する問題