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?
Avec version 15.6 , la fonctionnalité "Créer des projets CMake à partir de la boîte de dialogue Ajouter un nouveau projet" est apparue.
Cela crée un simple projet "Hello CMake" basé sur C++ ninja .
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++":
Il génère les fichiers suivants dans le dossier donné et utilise ensuite "Ouvrir le dossier":
CMakeLists.txt
CMakeSettings.json
MyProject1.cpp
Les prochaines étapes possibles seraient les suivantes:
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
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).
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/