From 8aabde768006214e1f7e91bc6ace1a59ed34dc45 Mon Sep 17 00:00:00 2001 From: ed Date: Thu, 23 Sep 2021 12:32:31 +0100 Subject: [PATCH] Projucer: Add Visual Studio 2022 exporter --- .../ProjectSaving/jucer_ProjectExport_MSVC.h | 45 +++++++ .../ProjectSaving/jucer_ProjectExporter.cpp | 113 +++++++++--------- 2 files changed, 102 insertions(+), 56 deletions(-) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h index 0586363ad2..4fdf47e791 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h @@ -1935,3 +1935,48 @@ public: JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC2019) }; + +//============================================================================== +class MSVCProjectExporterVC2022 : public MSVCProjectExporterBase +{ +public: + MSVCProjectExporterVC2022 (Project& p, const ValueTree& t) + : MSVCProjectExporterBase (p, t, getTargetFolderName()) + { + name = getDisplayName(); + + targetPlatformVersion.setDefault (getDefaultWindowsTargetPlatformVersion()); + platformToolsetValue.setDefault (getDefaultToolset()); + } + + static String getDisplayName() { return "Visual Studio 2022"; } + static String getValueTreeTypeName() { return "VS2022"; } + static String getTargetFolderName() { return "VisualStudio2022"; } + + Identifier getExporterIdentifier() const override { return getValueTreeTypeName(); } + + int getVisualStudioVersion() const override { return 17; } + String getSolutionComment() const override { return "# Visual Studio 2022"; } + String getToolsVersion() const override { return "17.0"; } + String getDefaultToolset() const override { return "v143"; } + String getDefaultWindowsTargetPlatformVersion() const override { return "10.0"; } + + static MSVCProjectExporterVC2022* createForSettings (Project& projectToUse, const ValueTree& settingsToUse) + { + if (settingsToUse.hasType (getValueTreeTypeName())) + return new MSVCProjectExporterVC2022 (projectToUse, settingsToUse); + + return nullptr; + } + + void createExporterProperties (PropertyListBuilder& props) override + { + static const char* toolsetNames[] = { "v140", "v140_xp", "v141", "v141_xp", "v142", "v143" }; + const var toolsets[] = { "v140", "v140_xp", "v141", "v141_xp", "v142", "v143" }; + addToolsetProperty (props, toolsetNames, toolsets, numElementsInArray (toolsets)); + + MSVCProjectExporterBase::createExporterProperties (props); + } + + JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC2022) +}; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp index 497b6a8bca..e1ec4dc0f5 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp @@ -38,20 +38,28 @@ #include "../Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h" //============================================================================== +static auto createIcon (const void* iconData, size_t iconDataSize) +{ + Image image (Image::ARGB, 200, 200, true); + Graphics g (image); + + std::unique_ptr svgDrawable (Drawable::createFromImageData (iconData, iconDataSize)); + svgDrawable->drawWithin (g, image.getBounds().toFloat(), RectanglePlacement::fillDestination, 1.0f); + + return image; +} + +template +static ProjectExporter::ExporterTypeInfo createExporterTypeInfo (const void* iconData, size_t iconDataSize) +{ + return { Exporter::getValueTreeTypeName(), + Exporter::getDisplayName(), + Exporter::getTargetFolderName(), + createIcon (iconData, iconDataSize) }; +} + std::vector ProjectExporter::getExporterTypeInfos() { - auto createIcon = [] (const void* iconData, size_t iconDataSize) - { - Image image (Image::ARGB, 200, 200, true); - Graphics g (image); - - std::unique_ptr svgDrawable (Drawable::createFromImageData (iconData, iconDataSize)); - - svgDrawable->drawWithin (g, image.getBounds().toFloat(), RectanglePlacement::fillDestination, 1.0f); - - return image; - }; - using namespace BinaryData; static std::vector infos @@ -65,28 +73,14 @@ std::vector ProjectExporter::getExporterTypeI XcodeProjectExporter::getTargetFolderNameiOS(), createIcon (export_xcode_svg, (size_t) export_xcode_svgSize) }, - { MSVCProjectExporterVC2019::getValueTreeTypeName(), - MSVCProjectExporterVC2019::getDisplayName(), - MSVCProjectExporterVC2019::getTargetFolderName(), - createIcon (export_visualStudio_svg, export_visualStudio_svgSize) }, - { MSVCProjectExporterVC2017::getValueTreeTypeName(), - MSVCProjectExporterVC2017::getDisplayName(), - MSVCProjectExporterVC2017::getTargetFolderName(), - createIcon (export_visualStudio_svg, export_visualStudio_svgSize) }, - { MSVCProjectExporterVC2015::getValueTreeTypeName(), - MSVCProjectExporterVC2015::getDisplayName(), - MSVCProjectExporterVC2015::getTargetFolderName(), - createIcon (export_visualStudio_svg, export_visualStudio_svgSize) }, + createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), + createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), + createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), + createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), - { MakefileProjectExporter::getValueTreeTypeName(), - MakefileProjectExporter::getDisplayName(), - MakefileProjectExporter::getTargetFolderName(), - createIcon (export_linux_svg, export_linux_svgSize) }, + createExporterTypeInfo (export_linux_svg, export_linux_svgSize), - { AndroidProjectExporter::getValueTreeTypeName(), - AndroidProjectExporter::getDisplayName(), - AndroidProjectExporter::getTargetFolderName(), - createIcon (export_android_svg, export_android_svgSize) }, + createExporterTypeInfo (export_android_svg, export_android_svgSize), { CodeBlocksProjectExporter::getValueTreeTypeNameWindows(), CodeBlocksProjectExporter::getDisplayNameWindows(), @@ -97,10 +91,7 @@ std::vector ProjectExporter::getExporterTypeI CodeBlocksProjectExporter::getTargetFolderNameLinux(), createIcon (export_codeBlocks_svg, export_codeBlocks_svgSize) }, - { CLionProjectExporter::getValueTreeTypeName(), - CLionProjectExporter::getDisplayName(), - CLionProjectExporter::getTargetFolderName(), - createIcon (export_clion_svg, export_clion_svgSize) } + createExporterTypeInfo (export_clion_svg, export_clion_svgSize) }; return infos; @@ -110,13 +101,8 @@ ProjectExporter::ExporterTypeInfo ProjectExporter::getTypeInfoForExporter (const { auto typeInfos = getExporterTypeInfos(); - auto predicate = [exporterIdentifier] (const ProjectExporter::ExporterTypeInfo& info) - { - return info.identifier == exporterIdentifier; - }; - auto iter = std::find_if (typeInfos.begin(), typeInfos.end(), - std::move (predicate)); + [exporterIdentifier] (const ProjectExporter::ExporterTypeInfo& info) { return info.identifier == exporterIdentifier; }); if (iter != typeInfos.end()) return *iter; @@ -130,7 +116,7 @@ ProjectExporter::ExporterTypeInfo ProjectExporter::getCurrentPlatformExporterTyp #if JUCE_MAC return ProjectExporter::getTypeInfoForExporter (XcodeProjectExporter::getValueTreeTypeNameMac()); #elif JUCE_WINDOWS - return ProjectExporter::getTypeInfoForExporter (MSVCProjectExporterVC2019::getValueTreeTypeName()); + return ProjectExporter::getTypeInfoForExporter (MSVCProjectExporterVC2022::getValueTreeTypeName()); #elif JUCE_LINUX || JUCE_BSD return ProjectExporter::getTypeInfoForExporter (MakefileProjectExporter::getValueTreeTypeName()); #else @@ -149,21 +135,35 @@ std::unique_ptr ProjectExporter::createNewExporter (Project& pr return exporter; } +template struct Tag {}; + +static std::unique_ptr tryCreatingExporter (Project&, const ValueTree&) { return nullptr; } + +template +static std::unique_ptr tryCreatingExporter (Project& project, + const ValueTree& settings, + Tag, + Tag... exporters) +{ + if (auto* exporter = Exporter::createForSettings (project, settings)) + return rawToUniquePtr (exporter); + + return tryCreatingExporter (project, settings, exporters...); +} + std::unique_ptr ProjectExporter::createExporterFromSettings (Project& project, const ValueTree& settings) { - std::unique_ptr exporter; - - exporter.reset (XcodeProjectExporter::createForSettings (project, settings)); - if (exporter == nullptr) exporter.reset (MSVCProjectExporterVC2019::createForSettings (project, settings)); - if (exporter == nullptr) exporter.reset (MSVCProjectExporterVC2017::createForSettings (project, settings)); - if (exporter == nullptr) exporter.reset (MSVCProjectExporterVC2015::createForSettings (project, settings)); - if (exporter == nullptr) exporter.reset (MakefileProjectExporter::createForSettings (project, settings)); - if (exporter == nullptr) exporter.reset (AndroidProjectExporter::createForSettings (project, settings)); - if (exporter == nullptr) exporter.reset (CodeBlocksProjectExporter::createForSettings (project, settings)); - if (exporter == nullptr) exporter.reset (CLionProjectExporter::createForSettings (project, settings)); - - jassert (exporter != nullptr); - return exporter; + return tryCreatingExporter (project, + settings, + Tag{}, + Tag{}, + Tag{}, + Tag{}, + Tag{}, + Tag{}, + Tag{}, + Tag{}, + Tag{}); } bool ProjectExporter::canProjectBeLaunched (Project* project) @@ -176,6 +176,7 @@ bool ProjectExporter::canProjectBeLaunched (Project* project) XcodeProjectExporter::getValueTreeTypeNameMac(), XcodeProjectExporter::getValueTreeTypeNameiOS(), #elif JUCE_WINDOWS + MSVCProjectExporterVC2022::getValueTreeTypeName(), MSVCProjectExporterVC2019::getValueTreeTypeName(), MSVCProjectExporterVC2017::getValueTreeTypeName(), MSVCProjectExporterVC2015::getValueTreeTypeName(),