@lebarsfa — ce rapport concerne les paquets IBEX publiés depuis lebarsfa/ibex-lib, dont les issues sont désactivées ; je le dépose donc ici, puisque c'est la CI de Codac qui l'a mis au jour.
Résumé
Le fichier share/pkgconfig/ibex.pc livré dans les paquets IBEX publiés porte un prefix= qui désigne le répertoire de la machine de build, et non celui où le paquet est installé. Tous les -I et -L qu'il émet pointent donc dans le vide chez l'utilisateur, et pkg-config devient inutilisable pour toute bibliothèque qui dépend d'IBEX — Codac au premier chef.
find_package(IBEX) n'est pas touché : ibex-config.cmake calcule son préfixe depuis son propre emplacement. C'est toute la différence.
Ce qui est livré aujourd'hui
Version 2.8.9.20260819, les trois familles de paquets :
Paquet Debian (libibex-dev-2.8.9.20260819-0resolute0_amd64.deb, installé dans /usr) :
prefix=/home/runner/work/ibex-lib/ibex-lib/ibex
includedir=${prefix}/include
libdir=${prefix}/lib
Cflags: -I${includedir} -I${includedir}/ibex -I${includedir}/ibex/3rd -I${includedir}/ibex/3rd
Libs: -L${libdir} -libex -L${libdir}/ibex/3rd -lgaol -lultim
Archive macOS (ibex_arm64_tahoe.zip, déployée dans /usr/local) :
prefix=/Users/runner/work/ibex-lib/ibex-lib/ibex
Archive Windows (ibex_x64_mingw15.zip) :
prefix=D:/a/ibex-lib/ibex-lib/ibex
Cflags: -I${includedir} -I${includedir}/ibex -ID:/a/ibex-lib/ibex-lib/gaol/include -ID:/a/ibex-lib/ibex-lib/mathlib/include
Libs: -L${libdir} -libex -LD:/a/ibex-lib/ibex-lib/gaol/lib -lgaol -LD:/a/ibex-lib/ibex-lib/mathlib/lib -lultim
Symptôme observé
Un programme qui consomme Codac via pkg-config — codac.pc déclarant Requires: ibex — échoue à la compilation :
codac2_Interval.h:19:10: fatal error: gaol/gaol_interval.h: No such file or directory
19 | #include <gaol/gaol_interval.h>
Les en-têtes de gaol sont pourtant bien installés, dans <prefix>/include/ibex/3rd/gaol/. C'est le -I émis par ibex.pc qui désigne un répertoire inexistant. Si l'on passe la compilation, le lien échoue à son tour sur -libex -lgaol -lultim, faute d'un -L valide.
Cause
cmake.utils/ibex-gen-pkgconfig.cmake, fonction IBEX_GENERATE_PKGCONFIG_FILE (ligne 111 en amont, cmake.utils/IbexUtils.cmake ligne 107 dans le fork) :
file (GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ibex.pc
CONTENT "prefix=${CMAKE_INSTALL_PREFIX}
ibex.pc.in fait la même chose avec prefix=@CMAKE_INSTALL_PREFIX@.
Le préfixe est donc figé au moment du cmake. Pour un paquet binaire, ce préfixe est le répertoire de staging du runner de CI, qui n'existe nulle part ailleurs.
Correctif proposé
pkg-config et pkgconf définissent la variable ${pcfiledir} : le répertoire du fichier .pc en cours de lecture. C'est l'équivalent exact du _IMPORT_PREFIX que ibex-config.cmake calcule déjà, et c'est la façon habituelle de rendre un .pc relogeable.
ibex.pc étant installé dans ${CMAKE_INSTALL_PKGCONFIG} (share/pkgconfig), il suffit de remonter du fichier vers le préfixe :
# Le chemin du .pc vers la racine d'installation, pour que le fichier
# décrive l'endroit où il se trouve réellement plutôt que celui où il a
# été configuré.
file (RELATIVE_PATH _pc_to_prefix
"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_PKGCONFIG}"
"${CMAKE_INSTALL_PREFIX}")
file (GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ibex.pc
CONTENT "prefix=\${pcfiledir}/${_pc_to_prefix}
Soit, dans le fichier livré, prefix=${pcfiledir}/../... Le reste du fichier est inchangé, includedir et libdir en dérivant déjà.
Un garde-fou est utile si CMAKE_INSTALL_PKGCONFIG peut être un chemin absolu : dans ce cas la relation au préfixe n'est plus garantie et il vaut mieux conserver le comportement actuel.
Un second défaut, propre à Windows
Sur l'archive Windows uniquement, gaol et mathlib sont désignés par des chemins absolus de l'arbre de build (D:/a/ibex-lib/ibex-lib/gaol/include, .../gaol/lib) qui ne sont même pas sous ${prefix}. Le correctif ci-dessus ne les rattrapera pas : ces entrées viennent de répertoires de l'interface de build de la cible qui ne sont jamais réécrits vers ${includedir}/${libdir}.
Sur Linux et macOS, les mêmes bibliothèques sont correctement rendues comme ${includedir}/ibex/3rd et ${libdir}/ibex/3rd. La différence tient donc à l'emplacement où gaol et mathlib sont construits sur Windows, en dehors de l'arbre d'installation.
On notera aussi, sur Linux et macOS, que -I${includedir}/ibex/3rd apparaît deux fois — bénin, mais c'est probablement le même mécanisme de réécriture qui en est responsable.
Contournement côté Codac, en attendant
Codac continue de déclarer Requires: ibex dans son codac.pc — c'est la bonne déclaration, et c'est elle qui portera la réponse une fois le correctif en place. En attendant, codac.pc énumère aussi lui-même les répertoires et archives d'IBEX, résolus au moment du configure depuis les cibles importées Ibex::ibex, Ibex::gaol et Ibex::ultim, qui sont correctes puisque ibex-config.cmake est relogeable.
Les doublons qui en résultent sont sans effet, et ce contournement pourra être retiré dès qu'un paquet IBEX corrigé sera publié.
Comment cela a été trouvé
Un test de CI ajouté à Codac construit un même programme deux fois contre une installation de Codac — une fois via find_package(CODAC), une fois via pkg-config — et compare les deux jeux de drapeaux. Il a signalé l'écart dès son premier passage, sur Linux x86_64 et arm64, macOS arm64 et x86_64, et Windows MinGW.
@lebarsfa — ce rapport concerne les paquets IBEX publiés depuis
lebarsfa/ibex-lib, dont les issues sont désactivées ; je le dépose donc ici, puisque c'est la CI de Codac qui l'a mis au jour.Résumé
Le fichier
share/pkgconfig/ibex.pclivré dans les paquets IBEX publiés porte unprefix=qui désigne le répertoire de la machine de build, et non celui où le paquet est installé. Tous les-Iet-Lqu'il émet pointent donc dans le vide chez l'utilisateur, etpkg-configdevient inutilisable pour toute bibliothèque qui dépend d'IBEX — Codac au premier chef.find_package(IBEX)n'est pas touché :ibex-config.cmakecalcule son préfixe depuis son propre emplacement. C'est toute la différence.Ce qui est livré aujourd'hui
Version 2.8.9.20260819, les trois familles de paquets :
Paquet Debian (
libibex-dev-2.8.9.20260819-0resolute0_amd64.deb, installé dans/usr) :Archive macOS (
ibex_arm64_tahoe.zip, déployée dans/usr/local) :Archive Windows (
ibex_x64_mingw15.zip) :Symptôme observé
Un programme qui consomme Codac via
pkg-config—codac.pcdéclarantRequires: ibex— échoue à la compilation :Les en-têtes de gaol sont pourtant bien installés, dans
<prefix>/include/ibex/3rd/gaol/. C'est le-Iémis paribex.pcqui désigne un répertoire inexistant. Si l'on passe la compilation, le lien échoue à son tour sur-libex -lgaol -lultim, faute d'un-Lvalide.Cause
cmake.utils/ibex-gen-pkgconfig.cmake, fonctionIBEX_GENERATE_PKGCONFIG_FILE(ligne 111 en amont,cmake.utils/IbexUtils.cmakeligne 107 dans le fork) :ibex.pc.infait la même chose avecprefix=@CMAKE_INSTALL_PREFIX@.Le préfixe est donc figé au moment du
cmake. Pour un paquet binaire, ce préfixe est le répertoire de staging du runner de CI, qui n'existe nulle part ailleurs.Correctif proposé
pkg-configetpkgconfdéfinissent la variable${pcfiledir}: le répertoire du fichier.pcen cours de lecture. C'est l'équivalent exact du_IMPORT_PREFIXqueibex-config.cmakecalcule déjà, et c'est la façon habituelle de rendre un.pcrelogeable.ibex.pcétant installé dans${CMAKE_INSTALL_PKGCONFIG}(share/pkgconfig), il suffit de remonter du fichier vers le préfixe :Soit, dans le fichier livré,
prefix=${pcfiledir}/../... Le reste du fichier est inchangé,includediretlibdiren dérivant déjà.Un garde-fou est utile si
CMAKE_INSTALL_PKGCONFIGpeut être un chemin absolu : dans ce cas la relation au préfixe n'est plus garantie et il vaut mieux conserver le comportement actuel.Un second défaut, propre à Windows
Sur l'archive Windows uniquement, gaol et mathlib sont désignés par des chemins absolus de l'arbre de build (
D:/a/ibex-lib/ibex-lib/gaol/include,.../gaol/lib) qui ne sont même pas sous${prefix}. Le correctif ci-dessus ne les rattrapera pas : ces entrées viennent de répertoires de l'interface de build de la cible qui ne sont jamais réécrits vers${includedir}/${libdir}.Sur Linux et macOS, les mêmes bibliothèques sont correctement rendues comme
${includedir}/ibex/3rdet${libdir}/ibex/3rd. La différence tient donc à l'emplacement où gaol et mathlib sont construits sur Windows, en dehors de l'arbre d'installation.On notera aussi, sur Linux et macOS, que
-I${includedir}/ibex/3rdapparaît deux fois — bénin, mais c'est probablement le même mécanisme de réécriture qui en est responsable.Contournement côté Codac, en attendant
Codac continue de déclarer
Requires: ibexdans soncodac.pc— c'est la bonne déclaration, et c'est elle qui portera la réponse une fois le correctif en place. En attendant,codac.pcénumère aussi lui-même les répertoires et archives d'IBEX, résolus au moment du configure depuis les cibles importéesIbex::ibex,Ibex::gaoletIbex::ultim, qui sont correctes puisqueibex-config.cmakeest relogeable.Les doublons qui en résultent sont sans effet, et ce contournement pourra être retiré dès qu'un paquet IBEX corrigé sera publié.
Comment cela a été trouvé
Un test de CI ajouté à Codac construit un même programme deux fois contre une installation de Codac — une fois via
find_package(CODAC), une fois viapkg-config— et compare les deux jeux de drapeaux. Il a signalé l'écart dès son premier passage, sur Linux x86_64 et arm64, macOS arm64 et x86_64, et Windows MinGW.