web-dev-qa-db-ja.com

Visual Studioでcmakeプロジェクトを作成する

Visual Studio 2017は、CMakeプロジェクトを処理するための組み込みサポートを提供します。 ドキュメント は、主に既存のcmakeプロジェクトに基づくシナリオをカバーしています。しかし、CMakeLists.txtファイルをいじる必要なくcmakeプロジェクトを作成するためのサポートはありますか?

8
user1934212

編集:VS2017 15.6は、公式の新しいプロジェクトCMakeウィザードを追加しました

バージョン15.6 により、「Add New ProjectダイアログからCMakeプロジェクトを作成する」機能が追加されました。

enter image description here

これにより、単純な ninja ベースのC++ "Hello CMake"プロジェクトが作成されます。

カスタムCMakeウィザード

あなたの質問と既存のWizardの欠如は私に1つを書くよう促しました。これは非常に基本的な設定であり、Visual Studio拡張機能の作成経験のある人が貢献すれば最も確実に利益を得るでしょうが、ここではは:

https://github.com/FloriansGit/VSCMakeWizards

Edit:最新のVSIXインストーラーもVS Marketplaceで無料で利用できるようになりました

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

新しい「CMake実行可能テンプレート」は、「ファイル/新規/プロジェクト/ Visual C++」の下でVisual Studio 2017を再起動すると表示されます。

CMake Project Wizard

指定されたフォルダに次のファイルを生成し、「フォルダを開く」を使用します。

CMakeLists.txt
CMakeSettings.json
MyProject1.cpp 

次のステップ

可能な次のステップは次のとおりです。

  • インタラクティブなWizard基本的なプロジェクト/コンパイラ設定のダイアログを追加
  • アイテムも追加しますWizard=ソースファイルをCMakeLists.txtに追加できるようにするには

基本的なアイデアについてのフィードバックをお待ちしています。リクエストを直接追加してください:

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

コード

また、参照用のウィザードの基本/初期コードは次のとおりです。

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

:Visual Studioは実際のソリューションを生成または開くことを試みるため、WizardCancelledExceptionが必要です。 「フォルダを開く」種類のプロジェクトウィザードはまだサポートされていません(このためのSDK APIはありません)。

参照資料

11
Florian

私の知る限り、新しいCMakeプロジェクトを作成するためのWizardはありませんが、CMakeSettings.jsonファイル。 https://blogs.msdn.Microsoft.com/vcblog/2017/08/14/cmake-support-in-visual-studio-customizing-your-environment/

0
Cinder Biscuits