La prise en charge des projets Makefile dans CLion est disponible !

Delphine Massenhove

La version CLion 2020.2 EAP2 apporte la très attendue prise en charge des projets Makefile. Bien que cette prise en charge n’en soit encore qu’à ses débuts, avec diverses limitations et problèmes connus, elle permet déjà de gérer une longue liste de projets.

Prise en charge des projets Makefile dans CLion

Vous avez un projet Makefile ? Téléchargez la version EAP gratuite et essayez-la dès maintenant. Et partagez vos commentaires avec nous !

Dans cet article, nous répondrons aux questions suivantes :

  • Comment cela fonctionne-t-il sous le capot ?
  • Comment démarrer avec votre projet Makefile dans CLion ?
  • Que puis-je faire si mon projet ne se charge pas correctement ?
  • Quels sont les problèmes et limitations connus ?

Notre approche pour l’implémentation

Il y a quelque temps, nous avons partagé nos conclusions et décrit l’approche que nous avons décidé d’adopter pour la prise en charge des projets Makefile dans CLion. À cette occasion, nous avions présenté les approches choisies par divers IDE et éditeurs C++ modernes pour gérer le Makefile :

  1. Les wrappers du compilateur sont utilisés pour encapsuler les appels réels du compilateur, puis une build full clean est effectuée et les informations du projet sont extraites.
  2. La variable d’environnement LD_PRELOAD est utilisée et une bibliothèque dynamique spécifique est chargée avant l’exécution de tout processus de build pour intercepter les appels du compilateur et collecter les informations du projet.
  3. La sortie de la commande make est analysée, souvent utilisée avec l’option --just-print pour éviter une build réelle.

La 3ème option offre plusieurs avantages majeurs :

  • Elle n’affecte pas le processus de build.
  • Elle nous permet de collecter les informations plus rapidement par rapport à la build complète du projet.
  • Elle fonctionnerait en tant qu’option “portable” car l’IDE peut théoriquement commencer avec la sortie Make enregistrée sur une autre machine.

Nous avons donc adopté la 3ème approche et implémenté un prototype. Nous l’avons testé sur une longue liste de projets, que vous pouvez trouver sur notre page Confluence. Et nous espérons qu’il fasse ses preuves pour de nombreux autres projets. Alors il est temps pour vous de l’essayer pour votre projet Makefile et de nous faire part de vos retours !

Comment démarrer avec votre projet Makefile dans CLion

Pour ouvrir un projet Makefile dans CLion :

  1. Sélectionnez le projet dans File | Open.
  2. Vous pouvez ouvrir un dossier en tant que projet et CLion recherchera les fichiers Makefile de niveau supérieur (ainsi que les fichiers CMakeList.txt ou compile_commands.json) et suggérera de l’ouvrir en tant que projet. Vous pouvez aussi pointer directement CLion vers un Makefile dans la boîte de dialogue Open.
  3. CLion vous demandera peut-être de nettoyer le projet. Cette étape est nécessaire car la build Make est incrémentielle et si elle s’exécute sur un projet non nettoyé, le rechargement du projet ne fonctionne pas correctement et ne prend pas en compte les fichiers inchangés, donc seuls les fichiers mis à jour sont compilés.
  4. CLion va maintenant essayer de charger le projet.
  5. Dès que le projet est correctement chargé, vous pouvez commencer à travailler dessus dans CLion et bénéficier ainsi de toutes les fonctionnalités intelligentes de l’IDE.

Makefiles en action

Vous pouvez jouer sur certains paramètres clés si les réglages par défaut ne vous conviennent pas. Cliquez sur Settings/Preferences | Build, Execution, Deployment | Makefile settings :
Paramètres Makefile

Ici, vous pouvez changer les éléments suivants :

  1. La Chaîne d’outils utilisée pour charger le projet Makefile. Toutes les chaînes d’outils locales (Clang, GCC, MinGW, Cygwin, WSL) sont prises en charge. La chaîne d’outils Visual Studio s’appuie sur NMake, qui n’est actuellement pas pris en charge, mais si vous parvenez à générer votre projet à l’aide de GNU Make, il fonctionnera dans CLion. Le mode à distance n’est pas encore inclus.
  2. Les Arguments utilisés pour appeler la commande make dans CLion afin d’extraire les informations du projet.
  3. Les cibles Build et Clean utilisées avec la commande make dans CLion pour extraire les informations du projet. Pour Build, un champ vide signifie que CLion prend la première cible spécifiée dans le Makefile du projet.

Encore quelques astuces pour travailler avec un projet Makefile dans CLion :

Astuce 1 : CLion recherche des cibles dans votre projet Makefile afin que vous puissiez commencer à les utiliser instantanément dans la configuration Run/Debug :
Makefile configurations

Et si CLion ne parvient pas à trouver votre cible Make, vous pouvez créer une cible de build personnalisée avec le type Make et l’utiliser dans les configurations :
Personnalisation des cibles makefile

Astuce 2 : les builds hors source sont prises en charge, mais vous voudrez probablement appeler Tools | Makefile | Change Project Root une fois le projet chargé afin que vos sources soient bien présentées dans la vue Projet.

Astuce 3 : Actuellement, en cas de modification de fichier, comme l’ajout d’un nouveau fichier par exemple, CLion ne met pas à jour et ne recharge pas automatiquement le projet. La notification sur le Makefile apparaîtra une fois que vous aurez fait la mise à jour, afin que vous n’oubliez pas de recharger le projet. Cependant, si l’étape de configuration est utilisée pour votre projet, n’oubliez pas de l’appeler en premier pour mettre à jour le Makefile et obtenir la notification.
Mise à jour de Makefile

Que puis-je faire si mon projet ne se charge pas correctement ?

Nous avons fait des tests sur une longue liste de projets, que vous pouvez trouver sur notre page Confluence. Et nous espérons le voir faire ses preuves également sur un large éventail d’autres projets, y compris le vôtre. Si toutefois vous rencontriez des problèmes, voici une liste de ce que vous pouvez faire :

  1. Vérifiez la chaîne d’outils que vous utilisez dans Settings/Preferences | Build, Execution, Deployment | Makefile settings. Vous devez pouvoir construire le projet dans l’environnement sélectionné.
  2. Contrôlez les arguments de rechargement et la cible de build dans Settings/Preferences | Build, Execution, Deployment | Makefile settings. La plupart des projets qui ont fonctionné correctement pour nous s’accommodaient bien de l’argument par défaut, mais vous pouvez avoir besoin de quelques modifications dans votre cas.
  3. Essayez Tools | Makefile | Clean and Reload Makefile Project.
  4. Si les étapes ci-dessus ne vous aident pas, essayez de nettoyer le projet à partir de /makefiles dans le répertoire système. Par exemple, pour le projet postgres sur mon macOS, il s’agit de ~/Library/Caches/JetBrains/CLion2020.2/makefiles/postgres.dc29ef090. Rechargez le projet après cela.
  5. Enfin, si les astuces ci-dessus ne fonctionnent pas pour vous, allez dans Help | Diagnostic Tools | Debug Log Settings… et activez les journaux de débogage en ajoutant #com.jetbrains.cidr.cpp.makefile. Ensuite, reproduisez le problème et envoyez les journaux à notre outil de suivi ou à notre service d’assistance.

Problèmes et limitations connus

La partie la plus fragile de l’algorithme utilisé est l’extraction des commandes de compilation de la sortie de la commande make. Nous avons constaté des problèmes dans certains cas :

  • Le projet supprime l’impression des répertoires. Et donc l’algorithme ne parvient pas à détecter correctement les fichiers source en cours de génération.
  • Le compilateur est inconnu ou les indicateurs de compilation ne peuvent pas être extraits correctement. Plusieurs wrappers comme libtool aggravent les choses en masquant les indicateurs de compilation et en interférant avec la sortie du Make (CPP-19549, CPP-19305).

Nous avons intégré plusieurs heuristiques pour surmonter les cas similaires à ceux rencontrés sur nos projets de test. Les utilisateurs peuvent également contrôler les arguments utilisés pour appeler la commande make lors de l’extraction des informations du projet : Settings/Preferences | Build, Execution, Deployment | Makefile | Arguments.

Qu’est-il prévu pour la suite ?

  • Il existe un plugin de prise en charge de Makefile qui fournit la mise en évidence du code et une prise en charge partielle de la génération de projets make. Nous allons le retravailler et l’intégrer dans CLion (CPP-16933).
  • L’intégration des tests unitaires sera activée pour les projets Makefile ultérieurement (CPP-20718).
  • Ajouter la possibilité de lier Makefile à un projet existant (CPP-20733).
  • La modification de la chaîne d’outils ou d’autres paramètres affectant le chargement du projet pour déclencher le rechargement (CPP-18982).
  • Pour étendre la prise en charge des projets GNU Autotool, autoriser les utilisateurs à paramétrer l’étape de “préconfiguration” pour les projets Makefile (CPP-16924).
  • Prendre en charge des Makes non GNU (NMake, BSD) (CPP-18723).
  • Implémenter l’approche avec les wrappers du compilateur pour la rendre fonctionnelle en combinaison avec l’approche actuelle.

Mais avant tout cela, nous allons peaufiner le prototype actuel et résoudre plusieurs problèmes. Et à ce stade, vos retours sont vraiment importants pour nous. Veuillez nous signaler tout problème rencontré via notre outil de suivi.

Gardez en tête la liste des projets sur lesquels nous avons déjà testé notre prototype : Projets Makefile dans CLion.

TÉLÉCHARGER CLION 2020.2 EAP

L’Équipe CLion
JetBrains
The Drive to Develop

Auteur de l’article original en anglais : Anastasia Kazakova