web-dev-qa-db-ja.com

PKG_CHECK_MODULESは有害と見なされますか?

さまざまな開発者がPKG_CHECK_MODULESの使用を推奨していません(たとえば、 この回答 )が、私が探している限り、その理由の明確で包括的な説明はありません。だから、私は尋ねます:

  • なぜPKG_CHECK_MODULESは有害なのでしょうか?
  • 選択肢は何ですか?

私は、今日初めてそれを使用しました。特に、GTK +のように、これらすべての依存関係がある非常に複雑なライブラリセットを処理する場合に、非常に便利であることがわかりました。

-I/usr/lib/i386-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0
-I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 
-I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 
-I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 
-I/usr/include/freetype2 -I/usr/include/libpng12

-lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 
-lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0
-lgthread-2.0 -lrt -lglib-2.0 
24
brandizzi

_PKG_CHECK_MODULES_の重要な問題の1つは、本来あるべきではない場所で障害が発生することです。ユーザーが_/p/a/t/h_にlibfooをインストールし、_LDFLAGS=-L/p/a/t/h_を使用してconfigureスクリプトを呼び出す場合、ユーザーは、構成がlibfooを見つけることを期待することで正当化されます。ただし、ユーザーは_PKG_CONFIG_PATH_を設定して、構成が成功するためにconfigureスクリプトが_foo.pc_を見つけられるようにする必要があります。私の意見では、これは壊れています。この問題を回避するために、標準メカニズムでライブラリが見つからない場合にのみ、_AC_CHECK_LIB_を呼び出してから_PKG_CHECK_MODULES_を呼び出すことができます。もう1つの問題は、_PKG_CHECK_MODULES_が情報が不正確な_.pc_ファイルを見つけて、ビルドが失敗する可能性があることです。その場合、_AC_CHECK_LIB_の後に_PKG_CHECK_MODULES_を呼び出す必要があります。

つまり、_PKG_CHECK_MODULES_を正しく使用するには、最初に_AC_CHECK_LIBS_を呼び出し、次に条件付きで_PKG_CHECK_MODULES_を呼び出し、次に_AC_CHECK_LIBS_を再度呼び出して、_PKG_CHECK_MODULES_によって検出された情報を検証する必要があります。 SOMECODE)__。ユーザーがライブラリを非標準の場所に簡単にインストールできるようにするための、メンテナ側のこの追加作業はすべてばかげています。ユーザーは、標準のメカニズムでライブラリを検索するようにツールチェーンを設定する必要があります。

-編集-

明確にするために、_PKG_CHECK_MODULES_の使用を推奨するライブラリを使用するパッケージは、構成での使用を避けるべきであることを示唆していません。むしろ、ライブラリがその使用を奨励せず、_.pc_ファイルの配布を停止することをお勧めします。 _.pc_ファイルによって解決しようとしている問題は、より高いレベルでより適切に対処されます。 autotoolsはnotパッケージ管理システムであり、これはパッケージ管理ツールで対処する必要のある問題です。

24
William Pursell

PKG_CHECK_MODULESの悪い面について少し詳しく説明しているブログ投稿がここにあります。

http://tirania.org/blog/archive/2012/Oct-20.html

またはこのstackoverflowの質問:

pkg-configマクロPKG_CHECK_MODULESの使用に失敗

要約すると、次のようになります。誰かがautoconfを実行しようとしていて、pkg-configがインストールされていない場合、非常に役に立たないエラーが発生します。これは、今日実行中に発生したエラーの例ですautoconf && ./configure

./configure: line 5283: syntax error near unexpected token `FFMPEG,'
./configure: line 5283: `   PKG_CHECK_MODULES(FFMPEG, libavutil libavformat libavcodec libswscale, HAVE_FFMPEG=yes)'

パッケージをコンパイルしようとしているだけのユーザー/開発者にとって、これは「pkg-configをインストールする必要がある」と叫ぶことはありません。

(記事が示唆しているように)pkg-configを直接呼び出すだけの場合、より役立つエラーが発生します。例:

AC_SUBST(MONO_LIBS)
AC_SUBST(MONO_CFLAGS)
if pkg-config --atleast-version=2.10 mono; then
   MONO_CFLAGS=`pkg-config --cflags mono`
   MONO_LIBS=`pkg-config --libs mono`
else
   AC_MSG_ERROR(Get your mono from www.go-mono.com)
fi

編集:コメントでHelmut Grohneは言う:

Pkg-configを直接呼び出さないでください。そうすることで、クロスコンパイルが中断されます。 AC_PATH_TOOL(PKG_CONFIG、pkg-config)以上のPKG_PROG_PKG_CONFIGを使用して、使用する$ PKG_CONFIGを検出します。

私はこれが正しいと思います、そしてあなたは彼の提案に従うべきです、しかし私はそれを個人的に試していません。

他の人々は、pkg-configをまったく使用しないことを提案しています。それは別の問題です。

6
JosephH