Skip to content

Le ibex.pc des paquets IBEX publiés n'est pas relogeable, ce qui rend Codac inutilisable via pkg-config #404

Description

@Jordan08

@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-configcodac.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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions