web-dev-qa-db-fra.com

Création d'un projet cmake avec Visual Studio

Visual Studio 2017 fournit une prise en charge intégrée pour la gestion des projets CMake. La documentation couvre principalement des scénarios basés sur des projets cmake préexistants. Mais existe-t-il un support pour créer un projet cmake sans avoir à manipuler le fichier CMakeLists.txt?

7
user1934212

EDIT: VS2017 15.6 ajouté un assistant nouveau projet CMake officiel

Avec version 15.6 , la fonctionnalité "Créer des projets CMake à partir de la boîte de dialogue Ajouter un nouveau projet" est apparue.

 enter image description here

Cela crée un simple projet "Hello CMake" basé sur C++ ninja .

Un assistant CMake personnalisé

Votre question et l'absence d'un Wizard existant m'ont incité à en écrire une. Il s’agit d’une configuration très basique qui en bénéficierait certainement si des personnes plus expérimentées dans la rédaction d’extensions Visual Studio y contribuaient, mais la voici:

https://github.com/FloriansGit/VSCMakeWizards

Edit: le dernier programme d'installation de VSIX est désormais disponible gratuitement sur VS Marketplace

https://marketplace.visualstudio.com/items?itemName=oOFlorianOo.CMakeProjectWizards

Le nouveau "Modèle exécutable CMake" apparaîtra après le redémarrage de votre Visual Studio 2017 sous "Fichier/Nouveau/Projet/Visual C++":

 CMake Project Wizard

Il génère les fichiers suivants dans le dossier donné et utilise ensuite "Ouvrir le dossier":

CMakeLists.txt
CMakeSettings.json
MyProject1.cpp 

Prochaines étapes

Les prochaines étapes possibles seraient les suivantes:

  • Ajouter un dialogue interactif Wizard pour certains paramètres de base du projet/compilateur
  • Ajoutez également un élément Wizard pour pouvoir ajouter des fichiers source au CMakeLists.txt

Je suis impatient de recevoir des commentaires sur l'idée de base. Veuillez ajouter toute demande directement à:

https://github.com/FloriansGit/VSCMakeWizards/issues

Le code

Et voici le code de base/initial de Wizards comme référence:

WizardImplementationClass.cs

// Based on https://docs.Microsoft.com/en-us/visualstudio/extensibility/how-to-use-wizards-with-project-templates
//      and https://stackoverflow.com/questions/3882764/issue-with-visual-studio-template-directory-creation

using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using EnvDTE;
using Microsoft.VisualStudio.TemplateWizard;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using EnvDTE80;

namespace VSCMakeWizards
{
    public class WizardImplementation : IWizard
    {
        public void RunStarted(object automationObject,
            Dictionary<string, string> replacementsDictionary,
            WizardRunKind runKind, object[] customParams)
        {
            var destinationDir = replacementsDictionary["$destinationdirectory$"];
            var desiredNamespace = replacementsDictionary["$safeprojectname$"];
            var templatePath = Path.GetDirectoryName((string)customParams[0]);

            var dte = automationObject as DTE2;
            var solution = dte.Solution as EnvDTE100.Solution4;

            if (solution.IsOpen)
            {
                solution.Close();
            }

            File.Copy(Path.Combine(templatePath, "CMakeSettings.json"), Path.Combine(destinationDir, "CMakeSettings.json"));
            File.Copy(Path.Combine(templatePath, "main.cpp"), Path.Combine(destinationDir, desiredNamespace + ".cpp"));

            // see https://stackoverflow.com/questions/1231768/c-sharp-string-replace-with-dictionary
            Regex re = new Regex(@"(\$\w+\$)", RegexOptions.Compiled);
            string input = File.ReadAllText(Path.Combine(templatePath, "CMakeLists.txt"));
            string output = re.Replace(input, match => replacementsDictionary[match.Groups[1].Value]);

            File.WriteAllText(Path.Combine(destinationDir, "CMakeLists.txt"), output);

            var vsSolution = Package.GetGlobalService(typeof(SVsSolution)) as IVsSolution7;

            if (vsSolution != null)
            {
                vsSolution.OpenFolder(destinationDir);
            }

            throw new WizardCancelledException();
        }

        // This method is called before opening any item that   
        // has the OpenInEditor attribute.  
        public void BeforeOpeningFile(ProjectItem projectItem)
        {
        }

        public void ProjectFinishedGenerating(Project project)
        {
        }

        // This method is only called for item templates,  
        // not for project templates.  
        public void ProjectItemFinishedGenerating(ProjectItem
            projectItem)
        {
        }

        // This method is called after the project is created.  
        public void RunFinished()
        {
        }

        // This method is only called for item templates,  
        // not for project templates.  
        public bool ShouldAddProjectItem(string filePath)
        {
            return false;
        }
    }
}

Note: La WizardCancelledException est nécessaire car, sinon, Visual Studio tenterait de générer/ouvrir une solution réelle. Un assistant de projet de type "Dossier ouvert" n'est pas encore pris en charge (pas d'API SDK pour cela).

Références

8
Florian

Autant que je sache, il n'y a pas de Wizard pour créer un nouveau projet CMake, mais cela peut être fait en configurant un fichier CMakeSettings.json. https://blogs.msdn.Microsoft.com/vcblog/2017/08/14/cmake-support-in-visual-studio-customizing-your-environment/

0
Cinder Biscuits