代码之家  ›  专栏  ›  技术社区  ›  Oblomov

使用visual studio创建cmake项目

  •  10
  • Oblomov  · 技术社区  · 7 年前

    Visual Studio 2017为处理CMake项目提供内置支持。 The documentation 主要涵盖基于预先存在的cmake项目的场景。但是,有没有人支持创建一个无需摆弄CMakeLists的cmake项目。txt文件?

    2 回复  |  直到 7 年前
        1
  •  15
  •   Florian    6 年前

    编辑:VS2017 15.6添加了一个官方的新项目CMake向导

    具有 version 15.6

    enter image description here

    这创建了一个简单的 基于C++的“Hello CMake”项目。

    你的问题和现有向导的缺乏启发了我写一个。这是一个非常基本的设置,如果在编写Visual Studio扩展方面有更多经验的人能够提供帮助,那么它肯定会受益匪浅,但具体如下:

    https://github.com/FloriansGit/VSCMakeWizards

    编辑

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

    重新启动Visual Studio 2017后,新的“CMake可执行模板”将显示在“File/new/Project/Visual C++”下:

    CMake Project Wizard

    它在给定文件夹中生成以下文件,然后在其上使用“打开文件夹”:

    CMakeLists.txt
    CMakeSettings.json
    MyProject1.cpp 
    

    下一步

    接下来可能采取的步骤是:

    • 为一些基本项目/编译器设置添加交互式向导对话框
    • 还添加一个项目向导,以便能够将源文件添加到 CMakeLists.txt

    我期待收到关于基本想法的反馈。请将任何请求直接添加到:

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

    代码

    以下是向导的基本/初始代码作为参考:

    WizardImplementationClass。反恐精英

    // 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;
            }
        }
    }
    

    笔记 :The WizardCancelledException 是必要的,因为Visual Studio会尝试生成/打开实际的解决方案。尚不支持“打开文件夹”类型的项目向导(没有用于此的SDK API)。

    工具书类

        2
  •  0
  •   Cinder Biscuits    7 年前

    据我所知,没有向导来创建新的CMake项目,但可以通过配置 CMakeSettings.json 文件 https://blogs.msdn.microsoft.com/vcblog/2017/08/14/cmake-support-in-visual-studio-customizing-your-environment/