VERSION、PACKAGEなどの再定義を避ける方法
質問
GNU autoconf/automake ビルドに関連する質問は見たことがありませんが、少なくとも何人かは GNU autoconf/automake ビルドに精通していることを願っています。これが次のとおりです。
別のプロジェクト (ベンダー) を含むプロジェクト (myproject と呼びます) があります。ベンダー プロジェクトは、他の人によって保守されているスタンドアロン プロジェクトです。このようなプロジェクトを含めることはかなり重要です 率直な, ただし、この場合には小さな問題があります。各プロジェクトは独自のを生成します config.h
ファイルには、PACKAGE、VERSION などの標準マクロが定義されています。これは、ベンダーのビルド中に、次のようなエラーが大量に発生することを意味します。
... warning: "VERSION" redefined
... warning: this is the location of the previous definition
... warning: "PACKAGE" redefined
... warning: this is the location of the previous definition
これらは少なくとも当面は単なる警告ですが、削除したいと考えています。Google 検索で見つけられた唯一の関連情報は、 これ automake メーリング リストのスレッドですが、あまり役に立ちません。他にもっと良いアイデアがある人はいますか?
解決
いくつかのメモ:
- 方法については言及しませんでした
config.h
引用符または山括弧付きで含まれていました。見る この他の質問 違いについて詳しくは、こちらをご覧ください。要するに、config.h
通常、 は山かっこではなく引用符で囲まれており、これによりプリプロセッサはconfig.h
プロジェクト独自のディレクトリから (通常はこれが必要です) - サブプロジェクトには、それを囲むプロジェクトのものが含まれている必要があると言います。
config.h
通常、これはまったく望んでいることではありません。サブプロジェクトはスタンドアロンであり、そのパッケージとバージョンはあなたのものではなく、そのサブプロジェクトのものである必要があります。たとえば、xmlreader プロジェクトに libxml を含める場合でも、libxml コードを PACKAGE libxml と VERSION (libxml のバージョンに関係なく) でコンパイルする必要があります。 - 通常、それは大きな間違いです
config.h
パブリックヘッダーから含めることができます。config.h
は常にプロジェクトまたはサブプロジェクトに対してプライベートであり、.c ファイルからのみ含める必要があります。したがって、ベンダーのドキュメントに「vendor.h」を含めるよう記載されており、そのパブリック ヘッダーに次のものが含まれている場合、config.h
どういうわけか、それはだめです。同様に、プロジェクトがライブラリの場合は含めないでください。config.h
公開されているヘッダーからどこにでもアクセスできます。
他のヒント
それは間違いなくハッキングですが、自動生成されたものを後処理します config.h
ファイル:
sed -e 's/.*PACKAGE_.*//' < config.h > config.h.sed && mv config.h.sed config.h
これは私たちのビルド環境では許容できますが、よりクリーンな方法に興味があります。
私の場合は非常に簡単な解決策があったことがわかりました。ベンダー プロジェクトは、複数のヘッダー ファイルを 1 つのモノリシック ヘッダー ファイルにまとめます。 #include
d ベンダーのソースによる。しかし、モノリシックヘッダーを構築する make ルールには、生成されたヘッダーが誤って含まれていました。 config.h
. 。パッケージ、バージョンなどの存在。モノリシック ヘッダー内の config 変数が再定義警告の原因となっていました。ベンダーの config.h
「config.h」は常に次のように解決されるため、無関係です。 $(top_builddir)/config.h
.
これが本来あるべきやり方だと私は信じています。デフォルトでは、サブプロジェクトには、それを囲むプロジェクトのものが含まれている必要があります。 config.h
ただし、サブプロジェクトがそれ自体を明示的にインクルードするか、独自のディレクトリが前に来るように INCLUDE パスを操作する場合を除きます。 $(top_builddir)
, 、または私の場合のようにヘッダーファイルを操作します。