私はautoconf
&automake
を使用するC++プロジェクトで作業しており、_*CPPFLAGS
_のインクルードパスを正しく設定するのに苦労しています。約3時間分のドキュメントを読みましたが、まだわかりません。私はハックを探しているのではなく、これを行う正しい方法を探しています。ここに私の難問があります。
私が見るように、インクルードパスには3つの完全に異なるソースがあります。
configure --with-XXX=<PATH>
_によって構成される、パッケージと共にインストールする必要がある外部ライブラリ。#include <file.h>
_がパッケージの一部であっても_file.h
_を使用しているため、それらをコンパイルするには、インクルードパスを正しく設定する必要があります。 (これらのファイルをすべて編集することはできません。)CPPFLAGS
を設定するべきではありません。私の現在のセットアップでは:
AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
によって_configure.ac
_内に設定されます。Makefile.am
_によって_test_CPPFLAGS = -I<path>
_によって設定されます。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
_を編集する必要がありますか?別の「正しい」解決策はありますか?
Autotoolsのマニュアルから正解を得るのは難しいことはわかっています。いくつかの開始から終了までのチュートリアル here と here があります。
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
_マクロが非常に役立つことがあります。