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

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

autoconf私は&を使用する C++ プロジェクトに取り組んでおりautomake、 のインクルード パスを正しく設定するのに苦労しています*CPPFLAGS。約 3 時間かけてドキュメントを読みましたが、まだ解決できません。ハックを探しているのではなく、これを行う正しい方法を探しています。これが私の難問です。

私の見るところ、インクルード パスにはまったく異なる 3 つのソースがあります。

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

現在の設定では:

  • タイプ 1 パスはconfigure.acによって内部に設定されますAC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
  • タイプ 2 パスはMakefile.amによって内部に設定されますtest_CPPFLAGS = -I<path>
  • タイプ 3 は設定できません。より正確に言うと、ユーザーが をCPPFLAGS実行する前にを設定するとmake、タイプ 1 の設定が上書きされ、コンパイルが失敗します。もちろん、ユーザーは代わりに を使用することも考えられますCXXFLAGSが、その場合は別の用途があります (覚えておいてください、私はこれを行う正しい方法を尋ねているのであって、ハックを尋ねているのではありません)。

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

Makefile.am修正方法としては、 内で常に を使用するように指定することですAM_CPPFLAGS。しかし、これは「規則どおり」でしょうか? これをグローバルに実行できますか、それとも を 1 つずつ編集する必要がありますかtarget_CPPFLAGS? 別の「正しい」解決策はありますか?

ベストアンサー1

オートツールのマニュアルから明確な答えを得るのは難しいことは分かっています。最初から最後までを網羅した良いチュートリアルがいくつかあります。ここそしてここ

*CPPFLAGSautoconfにはパッケージ固有の標準変数がありません。configureで呼び出すことができCPPFLAGS=...、automakeはこれをCPPFLAGS関連するmakefileルールに追加します。例については、ファイルCPPFLAGSで を検索してくださいMakefile.in。そのため、ないこの変数は他の用途にも使用できます。

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 番目のケースを説明します。最上位ディレクトリの下のfile.h別のディレクトリ にがあるとします。を使用すると、 を として含めることができます。あるいは、 を使用すると、 を として含めることができます。other-I$(top_srcdir)<other/file.h>-I$(top_srcdir)/other<file.h>

もう一つの便利なプリセット変数is 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

おすすめ記事