RHEL 6.8 で pkg-config --cflags openssl が何も返さないのはなぜですか?

RHEL 6.8 で pkg-config --cflags openssl が何も返さないのはなぜですか?

私はRHEL 6.8 Linuxマシンで実行しています。ソースtarballs/git-repos/whateferからさまざまなパッケージをビルドしたいと考えています。それなしシステム構成の変更 (root または sudo 下)。

私は RHEL 6.8 マシンで実行しています:

bash-4.1$ cat /etc/issue
Red Hat Enterprise Linux Workstation release 6.8 (Santiago)
Kernel \r on an \m

openssl-develインストールされています:

bash-4.1$ rpm -q -a | grep openssl
openssl-1.0.1e-48.el6.i686
openssl098e-0.9.8e-20.el6_7.1.x86_64
openssl098e-0.9.8e-20.el6_7.1.i686
openssl-devel-1.0.1e-48.el6.i686
openssl-1.0.1e-48.el6.x86_64
openssl-devel-1.0.1e-48.el6.x86_64

したがって、このコマンドが何らかの出力を返すことを期待しています。これにより、pkg-config を使用するソースからパッケージをビルドするときに、必要な CFLAGS の値が見つかります。

bash-4.1$ pkg-config --cflags openssl

しかし、返されるのは改行だけです。なぜでしょうか?

さらにデバッグ:

使用しているファイルを表示します:

bash-4.1$ pkg-config --debug --list-all 2>&1 | grep 'Will find package.*openssl'
Will find package 'openssl' in file '/usr/lib64/pkgconfig/openssl.pc'

読み取るファイルを表示します:

bash-4.1$ cat /usr/lib64/pkgconfig/openssl.pc
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: 1.0.1e
Requires: 
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -Wl,-z,relro -ldl -lz -L/usr/lib -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto -lresolv
Cflags: -I${includedir} -I/usr/include

grep の範囲を広げる:

bash-4.1$ pkg-config --debug --list-all 2>&1 | grep 'openssl'
File 'openssl.pc' appears to be a .pc file
Will find package 'openssl' in file '/usr/lib64/pkgconfig/openssl.pc'
Looking for package 'openssl'
Looking for package 'openssl-uninstalled'
Reading 'openssl' from file '/usr/lib64/pkgconfig/openssl.pc'
Parsing package file '/usr/lib64/pkgconfig/openssl.pc'
Unknown keyword 'Libs.private' in '/usr/lib64/pkgconfig/openssl.pc'
Removing -I/usr/include from cflags for openssl
Removing -I/usr/include from cflags for openssl
Removing -L /usr/lib64 from libs for openssl
Adding 'openssl' to list of known packages, returning as package 'openssl'
openssl                     OpenSSL - Secure Sockets Layer and cryptography libraries and tools
bash-4.1$ 

うーん、あれはRemoving -I/usr/include from cflags for opensslそこで何をしているのでしょうか?

また、Cflags変数が定義されています。これはバグでしょうか?cflagsそれともそうすべきでしょうか?

また、私は独自のpkg-config(バージョン 0.29.2)をダウンロードしてビルドしましたが、同じ動作をします。そのため、ファイルにバグがあるのではないかと疑っていますopenssl.pcが、確信はありません。

それでも、さまざまなパッケージスクリプトを呼び出す直前にCFLAGS、ハードコードされた値をエクスポートする以外の修正方法は何でしょうか?LDFLAGS./configure

答え1

pkg-configフラグの重複を排除し、/usr/include などの「デフォルト」パスもスキップするようです。

見る、

$ printf "Name: whatever\nVersion: 1\nDescription: bla\nCflags: -I/usr/include" > /tmp/x.pc
$ pkg-config --cflags  /tmp/x.pc

$ printf "Name: whatever\nVersion: 1\nDescription: bla\nCflags: -I/usr/includeX" > /tmp/y.pc
$ pkg-config --cflags  /tmp/y.pc
-I/usr/includeX

これらのデフォルト ディレクトリは pkg-config のビルド時に設定されます。ソースの README.md を参照してください。

./configure \
     --prefix=/opt/pkgconf \
     --with-system-libdir=/lib:/usr/lib \
     --with-system-includedir=/usr/include

実行時に環境変数を使用してその動作を無効にすることができます:

$ PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --cflags  /tmp/x.pc
-I/usr/include

または組み込みのデフォルトを上書きします:

$ PKG_CONFIG_SYSTEM_INCLUDE_PATH="/whatever" pkg-config --cflags  /tmp/x.pc
-I/usr/include

最近のpkg-configにはコマンドラインオプションもあり--keep-system-cflags--keep-system-libs

関連情報