autoconf
私は&を使用する C++ プロジェクトに取り組んでおりautomake
、 のインクルード パスを正しく設定するのに苦労しています*CPPFLAGS
。約 3 時間かけてドキュメントを読みましたが、まだ解決できません。ハックを探しているのではなく、これを行う正しい方法を探しています。これが私の難問です。
私の見るところ、インクルード パスにはまったく異なる 3 つのソースがあります。
- 私のパッケージと一緒にインストールする必要があり、 によって構成される外部ライブラリ
configure --with-XXX=<PATH>
。 - 私のパッケージ内では、一部のソース ファイルは がパッケージの一部で
#include <file.h>
あっても を使用するfile.h
ため、それらをコンパイルするには、インクルード パスを正しく設定する必要があります。(これらのファイルすべてを編集することはできません。) - 気まぐれな(または気まぐれでない)標準では、ユーザーが独自の(追加の)インクルード パスを指定できるようにする必要があると規定されています。つまり、まったく設定す
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>_CPPFLAGS
test_CPPFLAGS
test
Makefile.am
修正方法としては、 内で常に を使用するように指定することですAM_CPPFLAGS
。しかし、これは「規則どおり」でしょうか? これをグローバルに実行できますか、それとも を 1 つずつ編集する必要がありますかtarget_CPPFLAGS
? 別の「正しい」解決策はありますか?
ベストアンサー1
オートツールのマニュアルから明確な答えを得るのは難しいことは分かっています。最初から最後までを網羅した良いチュートリアルがいくつかあります。ここそしてここ。
*CPPFLAGS
autoconfにはパッケージ固有の標準変数がありません。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
。