web-dev-qa-db-ja.com

autotoolsでインクルードパスを設定する方法

私はautoconfautomakeを使用するC++プロジェクトで作業しており、_*CPPFLAGS_のインクルードパスを正しく設定するのに苦労しています。約3時間分のドキュメントを読みましたが、まだわかりません。私はハックを探しているのではなく、これを行う正しい方法を探しています。ここに私の難問があります。

私が見るように、インクルードパスには3つの完全に異なるソースがあります。

  1. _configure --with-XXX=<PATH>_によって構成される、パッケージと共にインストールする必要がある外部ライブラリ。
  2. パッケージ内で、一部のソースファイルは_#include <file.h>_がパッケージの一部であっても_file.h_を使用しているため、それらをコンパイルするには、インクルードパスを正しく設定する必要があります。 (これらのファイルをすべて編集することはできません。)
  3. 気まぐれな(またはない)標準では、ユーザーが独自の(追加の)インクルードパスを指定できるようにする必要があります。つまり、CPPFLAGSを設定するべきではありません。

私の現在のセットアップでは:

  • タイプ1のパスは、AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")によって_configure.ac_内に設定されます。
  • タイプ2のパスは_Makefile.am_によって_test_CPPFLAGS = -I<path>_によって設定されます。
  • タイプ3は設定できません。より正確には、ユーザーがCPPFLAGSを実行する前にmakeを設定すると、タイプ1の設定が上書きされ、コンパイルが失敗します。もちろん、ユーザーは代わりにCXXFLAGSを使用することもできますが、その使用方法は異なります(ハッキングではなく、正しい方法を求めていることに注意してください)。

_AM_CPPFLAGS_内の_configure.ac_を使用してタイプ1パスを設定することで、これを修正しようとしました。 (参考:CPPFLAGSの代わりに_AM_CPPFLAGS_を設定しても、_AC_CHECK_HEADERS_などのチェックを実行する必要がある場合は、一時的にCPPFLAGSを設定してから、チェックが機能するように元に戻します。これは ここ で説明されています。これにより、タイプ3パスのCPPFLAGSが解放されますが、Makefile- sが原因でコンパイルが失敗しますconfigureによって生成される_AM_CPPFLAGS_は、特殊な_<target>_CPPFLAGS_が存在しない場合にのみ使用されます。したがって、_test_CPPFLAGS_がタイプ2パスで存在する場合、testのコンパイルはタイプ1パスを取得しないため失敗します。

修正は、常に_Makefile.am_を使用して_AM_CPPFLAGS_を使用するように指定することです。しかし、これは「本による」でしょうか。これをグローバルに行うことはできますか、またはすべての_target_CPPFLAGS_を編集する必要がありますか?別の「正しい」解決策はありますか?

15
Matei David

Autotoolsのマニュアルから正解を得るのは難しいことはわかっています。いくつかの開始から終了までのチュートリアル herehere があります。

Autoconfには、パッケージ固有の_*CPPFLAGS_の標準変数はありません。 configureは_CPPFLAGS=..._で呼び出すことができ、automakeはこのCPPFLAGSを関連するメイクファイルルールに追加します-_Makefile.in_ファイルでCPPFLAGSを検索します例。そのため、この変数を他の目的で使用しないことをお勧めします。

_Makefile.am_のフラグを_AM_CPPFLAGS_変数(すべてのプリプロセッサー呼び出しのデフォルト)に追加するか、個々のプリプロセッサーフラグを_target_CPPFLAGS_でオーバーライドします。サードパーティライブラリの例では、_FOO_CPPFLAGS_のような名前を使用してプリプロセッサオプションを保持するのが最適です。

_FOO_CPPFLAGS="-I${FOO_DIR}/include -DFOO_BAR=1"
...
AC_SUBST(FOO_CPPFLAGS)
_

および_Makefile.am_で:

_AM_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)
# or:
target_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)
_

_top_srcdir_変数はconfigureによって定義されます-2番目のケースを説明するために使用します。トップレベルディレクトリの下の別のディレクトリotherに_file.h_があるとします。 -I$(top_srcdir)を使用すると、_<other/file.h>_として含めることができます。または、-I$(top_srcdir)/otherを使用すると、_<file.h>_として含めることができます。

別の便利な プリセット変数srcdir-現在のディレクトリです。 -I$(srcdir)がデフォルトで_AM_CPPFLAGS_に追加されます。したがって、_file.h_が現在のディレクトリにある場合は、_<file.h>_または_"file.h"_を含めることができます。 otherが「兄弟」ディレクトリである場合、-I$(srcdir)/..は_<other/file.h>_を含めることを許可し、-I$(srcdir)/../otherは_<file.h>_を許可します。


一部のパッケージではpkg-config _.pc_ファイルがインストールされることも追加します。 pkg-configのインストールが適切なディレクトリを検索するように設定されている場合、_PKG_CHECK_MODULES_マクロが非常に役立つことがあります。

29
Brett Hale