Skip to content

Using CMake for compilation #368

@cyrilbouvier

Description

@cyrilbouvier

Ce ticket sert à discuter du changement de waf à CMake comme système de compilation d'Ibex, comme cela a été discuté aux IbexDays 2019.

Prérequis

Les questions auxquelles ils faut répondre avant de faire le changement:

  • Comment les plugins intéragissent avec le noyau Ibex ?
  • Quels est le statut des opérateurs ? Plugin ou noyau ? Extensible par plugin ?
  • ... (à compléter si nécessaire)

Méthode

Je vois deux façon de procéder au changement:

  1. Faire une branche où l'on implémente tous et qu'on merge une fois que c'est terminé
  2. Faire des changements progressifs dans la branche develop en faisant coexister CMake et waf tant que les scripts CMake ne sont pas terminés.

Je pencherai plutôt pour la deuxième façon, car s'il les changements prennent du temps, le moment où il faudra merger risque d'être compliqué. La deuxième façon permettrai aussi d'ajouter progressivement des tests pour CMake dans Travis afin d'éviter les regressions par rapport au reste du code qui continuera à évoluer.

Features

Voic une liste des features que doit posséder le système de compilation (obtenue en regardant ce que propose la compilation via waf actuellement (./waf --help) et des discussions des IbexDays 2019).
N'hésiter pas à compléter ou à en enlever si nécessaire.
J'ai mis des ❓ sur les features pour lesquels je ne sais pas si il faut les garder ou pas.

Les checkbox validées correspondent à ce qui est déjà fait dans la branche with_cmake_v2.6.5 du fork de @benEnsta (à vérifier, j'ai peut-être raté des features déjà implémentés)

  • Compilation de libibex

    • détection des dépendences:
      • flex
      • bison
      • fmemopen
        ❓ plus de détails
        utilisé dans tests
        Dans la version CMake, il y a du code pour le détecter mais cela n'a pas l'air de marcher: il ne le détecte pas sur ma machine alors qu'il est dispo.
        Un fallback est dispo dans tests/3rd/fmemopen mais n'est pas utilisé par la version CMake
        La fonction fmemopen est utilisée dans trois tests (dont 1 qui pourrait utilisé un fichier), il serait peut être plus simple d'utiliser des fichiers temporaires pour les deux autres tests et enlever cette dépendence
      • cppunittest
    • compilation des sources en libibex.a ou libibex.so
    • tests
    • examples
    • benchmarks
      plus de détails Beaucoup de code python/waf pour gérer les benchs, cela risque d'être long/compliqué à traduire en CMake. Je vois deux possibilités: trouver un package CMake qui fait les benchs et adapter ce qui a été fait à ce package ou faire un script python qui fait les benchs (à partir de ce qui existe déjà) et que `make benchmarks` ne fasse que appeler ce script.
    • compilation en mode debug
    • obligation d'avoir c++11 ? (waf l'impose, pas les scripts CMake du fork)
    • flags (waf utilise std=c++11 -O3 -Wno-deprecated -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-function, les scripts CMake du fork utilisent les flags par défaut)
  • Intégration des bibliothèques de calcul d'intervalles

    • gaol
      • utilisée par défaut ou via une option WITH_GAOL
      • possibilité de passer les chemins à CMake pour qu'il trouve la bibliothèque
      • installation automatique si aucune bibliothèque trouvée
    • filib
      • utilisable via une option WITH_FILIB
      • possibilité de passer les chemins à CMake pour qu'il trouve la bibliothèque
      • ❓ installation automatique si demandée et pas trouvée
    • bias
      • utilisable via une option WITH_BIAS
      • possibilité de passer les chemins à CMake pour qu'il trouve la bibliothèque
      • ❓ installation automatique si demandée et pas trouvée
    • direct
      • utilisable via une option WITH_DIRECT
  • Intégration des bibliothèques de programmation linéaire (pour le plugin optim)
    Est-ce que cela doit être géré dans le fichier CMake principal ou par le plugin optim ? D'autres plugins utilisent-ils une bibliothèque de programmation linéaire ?

    • clp (pas d'install automatique pour l'intant)
      • utilisable via une option WITH_CLP
      • possibilité de passer les chemins à CMake pour qu'il trouve la bibliothèque
      • ❓ installation automatique si demandée et pas trouvée
    • cplex
      • utilisable via une option WITH_CPLEX
      • possibilité de passer les chemins à CMake pour qu'il trouve la bibliothèque
      • ❓ installation automatique si demandée et pas trouvée
    • soplex
      • utilisable via une option WITH_SOPLEX
      • possibilité de passer les chemins à CMake pour qu'il trouve la bibliothèque
      • ❓ installation automatique si demandée et pas trouvée
    • none
      • par défaut pas de bibliothèque de programmation linéaire
  • distribution

    • création automatique de ibex-x.y.z-Source.tar.gz pour le download des sources (automatique avec CPack dans CMake)
    • création automatique de ibex-x.y.z-Linux.tar.gz pour le download de la bibliothèque précompilées (automatique avec CPack dans CMake)
    • création automatique de ibex-x.y.z.deb pour la distribution de paquets debian (devrait être facile à faire avec les outils CPack et CPackDeb de CMake)
    • compilation sous windows de ibex.dll et/ou ibexopt.exe et/ou ibexsolve.exe pour distribuer des exécutables pour windows (cf appveyor de la branche with_cmake et/ou CPack sous windows)
    • compilation des fichiers nécessaires à Pybex (Pybex est il un plugin ou intégré au noyau)
  • plugins

    • Faut-il séparer les dépots ou pas ?
    • Chaque plugin doit-il ajouter ses sources au noyau (comme actuellement) pour créer libibex ou chaque plugin doit-il créer un binaire (ibexop, ibexsolve) ou une bibliothèque supplémentaire en utilisant libibex (par exemple libibex-sip)
    • Dans le cas où les plugins sont séparés, il faut créer des macros pour faciliter l'écriture des fichiers CMake des plugins.
  • opérateurs

    • plugin ou dans le noyau ?
    • si dans le noyau, un utilisateur doit-il pouvoir ajouter des opérateurs via un plugin ?

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions