-
Notifications
You must be signed in to change notification settings - Fork 53
Description
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:
- Faire une branche où l'on implémente tous et qu'on merge une fois que c'est terminé
- 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 danstests/3rd/fmemopenmais 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.aoulibibex.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)
- détection des dépendences:
-
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
- gaol
-
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
- clp (pas d'install automatique pour l'intant)
-
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_cmakeet/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
libibexou chaque plugin doit-il créer un binaire (ibexop,ibexsolve) ou une bibliothèque supplémentaire en utilisantlibibex(par exemplelibibex-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 ?