
Estoy ejecutando en una máquina Linux RHEL 6.8. Estoy buscando crear varios paquetes a partir de archivos tarballs/git-repos/whatefersincambiar la configuración del sistema (bajo root o sudo).
Estoy ejecutando en una máquina 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
esta instalado:
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
Así que espero que este comando devuelva algún resultado, de modo que cuando construya paquetes desde el código fuente que usen pkg-config, encuentren el valor de CFLAGS que necesitan:
bash-4.1$ pkg-config --cflags openssl
Pero devuelve sólo una nueva línea. ¿Por qué?
Depuración adicional:
Muestra qué archivo está usando:
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'
Muestre el archivo que debería estar leyendo:
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
Ampliando el 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$
Mmmm que hace eso Removing -I/usr/include from cflags for openssl
ahí?
Además, la Cflags
variable está definida. ¿Es eso un error? ¿Debería serlo cflags
en su lugar?
Además, descargué y construí la mía propia pkg-config
, versión 0.29.2, y ofrece el mismo comportamiento. Sospecho que hay un error en el openssl.pc
archivo, pero no estoy seguro.
Aun así, ¿cuál es la solución además de exportar valores codificados CFLAGS
y LDFLAGS
justo antes de llamar a los distintos ./configure
scripts de paquetes?
Respuesta1
Parece que pkg-config
elimina los duplicados y también omite las rutas "predeterminadas", como /usr/include.
Ver,
$ 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
Estos directorios predeterminados se configuran en el momento de la compilación de pkg-config; consulte README.md en las fuentes:
./configure \
--prefix=/opt/pkgconf \
--with-system-libdir=/lib:/usr/lib \
--with-system-includedir=/usr/include
Puede desactivar ese comportamiento en tiempo de ejecución mediante la variable de entorno:
$ PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --cflags /tmp/x.pc
-I/usr/include
o anular el valor predeterminado incorporado:
$ PKG_CONFIG_SYSTEM_INCLUDE_PATH="/whatever" pkg-config --cflags /tmp/x.pc
-I/usr/include
El pkg-config reciente también tiene opciones de línea de comandos --keep-system-cflags
y--keep-system-libs