
Ich verwende eine RHEL 6.8 Linux-Maschine. Ich möchte verschiedene Pakete aus Quell-Tarballs/Git-Repos/was auch immer erstellen.ohneÄndern der Systemkonfiguration (unter root oder sudo).
Ich verwende auf einer RHEL 6.8-Maschine:
bash-4.1$ cat /etc/issue
Red Hat Enterprise Linux Workstation release 6.8 (Santiago)
Kernel \r on an \m
openssl-devel
ist installiert:
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
Daher erwarte ich, dass dieser Befehl eine Ausgabe zurückgibt, sodass beim Erstellen von Paketen aus Quellen, die pkg-config verwenden, diese den benötigten CFLAGS-Wert finden:
bash-4.1$ pkg-config --cflags openssl
Aber es gibt nur eine neue Zeile zurück. Warum?
Weiteres Debuggen:
Zeigen Sie, welche Datei verwendet wird:
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'
Zeigen Sie die Datei an, die gelesen werden soll:
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
Erweitern des Grep-Outs:
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$
Hmmm, was Removing -I/usr/include from cflags for openssl
macht das da?
Außerdem Cflags
ist die Variable definiert. Ist das ein Fehler? Sollte es cflags
stattdessen so sein?
Außerdem habe ich meine eigene pkg-config
Version 0.29.2 heruntergeladen und erstellt, und sie zeigt das gleiche Verhalten. Ich vermute also einen Fehler in der openssl.pc
Datei, bin mir aber nicht sicher.
Was ist dennoch die Lösung, außer das Exportieren von fest codierten Werten von CFLAGS
und LDFLAGS
unmittelbar vor dem Aufrufen der verschiedenen Paketskripte ./configure
?
Antwort1
Es scheint, als pkg-config
würden Flags dupliziert und auch „Standard“-Pfade wie /usr/include übersprungen.
Sehen,
$ 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
Diese Standardverzeichnisse werden zur Build-Zeit von pkg-config festgelegt, siehe README.md in den Quellen:
./configure \
--prefix=/opt/pkgconf \
--with-system-libdir=/lib:/usr/lib \
--with-system-includedir=/usr/include
Sie können dieses Verhalten zur Laufzeit über die Umgebungsvariable deaktivieren:
$ PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --cflags /tmp/x.pc
-I/usr/include
oder überschreiben Sie die integrierte Standardeinstellung:
$ PKG_CONFIG_SYSTEM_INCLUDE_PATH="/whatever" pkg-config --cflags /tmp/x.pc
-I/usr/include
Die aktuelle pkg-config verfügt auch über Kommandozeilenoptionen --keep-system-cflags
und--keep-system-libs