diff --git a/.gitignore b/.gitignore index 629e360a22..79010840e2 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ profile **/LinuxMakefile/build **/VisualStudio[0-9]*/Win32 **/VisualStudio[0-9]*/x64 +**/VisualStudio[0-9]*/packages **/Builds/x64 **/.vs **/CodeBlocks/bin diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h index a1385168f4..a26c0d849d 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h @@ -925,6 +925,15 @@ public: imports->setAttribute ("Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props"); } + if (owner.shouldAddMidiPackage()) + { + const auto path = "packages\\" + cppwinrtPackage.name + "." + cppwinrtPackage.version + "\\build\\native\\Microsoft.Windows.CppWinRT.props"; + + auto* imports = projectXml.createNewChildElement ("Import"); + imports->setAttribute ("Project", path); + imports->setAttribute ("Condition", "Exists('" + path + "')"); + } + for (ConstConfigIterator i (owner); i.next();) { auto& config = *static_cast (&*i); @@ -1298,31 +1307,45 @@ public: e->setAttribute ("Include", prependDot (getOwner().rcFile.getFileName())); } + if (owner.shouldAddMidiPackage()) + { + auto* group = projectXml.createNewChildElement ("ItemGroup"); + auto* reference = group->createNewChildElement ("Reference"); + reference->setAttribute ("Include", midiPackage.name); + + auto* hintPath = reference->createNewChildElement ("HintPath"); + hintPath->addTextElement ("packages\\" + midiPackage.name + "." + midiPackage.version + "\\ref\\native\\" + midiPackage.name + ".winmd"); + + auto* isWinmd = reference->createNewChildElement ("IsWinMDFile"); + isWinmd->addTextElement ("true"); + } + { auto* e = projectXml.createNewChildElement ("Import"); e->setAttribute ("Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets"); } + std::vector packagesToInclude; + owner.getPackagesToInclude (packagesToInclude); + + for (const auto& package : packagesToInclude) { - if (owner.shouldAddWebView2Package()) - { - auto* importGroup = projectXml.createNewChildElement ("ImportGroup"); - importGroup->setAttribute ("Label", "ExtensionTargets"); + auto* importGroup = projectXml.createNewChildElement ("ImportGroup"); + importGroup->setAttribute ("Label", "ExtensionTargets"); - auto packageTargetsPath = "packages\\" + getWebView2PackageName() + "." + getWebView2PackageVersion() - + "\\build\\native\\" + getWebView2PackageName() + ".targets"; + const auto packageTargetsPath = "packages\\" + package.name + "." + package.version + + "\\build\\native\\" + package.name + ".targets"; - auto* e = importGroup->createNewChildElement ("Import"); - e->setAttribute ("Project", packageTargetsPath); - e->setAttribute ("Condition", "Exists('" + packageTargetsPath + "')"); - } + auto* e = importGroup->createNewChildElement ("Import"); + e->setAttribute ("Project", packageTargetsPath); + e->setAttribute ("Condition", "Exists('" + packageTargetsPath + "')"); + } - if (owner.shouldLinkWebView2Statically()) - { - auto* propertyGroup = projectXml.createNewChildElement ("PropertyGroup"); - auto* loaderPref = propertyGroup->createNewChildElement ("WebView2LoaderPreference"); - loaderPref->addTextElement ("Static"); - } + if (owner.shouldLinkWebView2Statically()) + { + auto* propertyGroup = projectXml.createNewChildElement ("PropertyGroup"); + auto* loaderPref = propertyGroup->createNewChildElement ("WebView2LoaderPreference"); + loaderPref->addTextElement ("Static"); } } @@ -2661,27 +2684,64 @@ protected: && project.isConfigFlagEnabled ("JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING", false); } - static String getWebView2PackageName() { return "Microsoft.Web.WebView2"; } - static String getWebView2PackageVersion() { return "1.0.1901.177"; } + bool shouldAddMidiPackage() const + { + return project.getEnabledModules().isModuleEnabled ("juce_audio_devices") + && project.isConfigFlagEnabled ("JUCE_USE_WINDOWS_MIDI_SERVICES", false); + } + + struct NuGetPackage + { + String name; + String version; + bool targetFrameworkNative = false; + }; + + inline static const NuGetPackage webviewPackage { "Microsoft.Web.WebView2", "1.0.1901.177", false }; + inline static const NuGetPackage cppwinrtPackage { "Microsoft.Windows.CppWinRT", "2.0.240405.15", true }; + inline static const NuGetPackage midiPackage { "Microsoft.Windows.Devices.Midi2", "1.0.3-preview-10.250204-1909", false }; + + void getPackagesToInclude (std::vector& result) const + { + if (shouldAddWebView2Package()) + result.push_back (webviewPackage); + + if (shouldAddMidiPackage()) + { + result.push_back (cppwinrtPackage); + result.push_back (midiPackage); + } + } void createPackagesConfigFile() const { - if (shouldAddWebView2Package()) + std::vector packagesToInclude; + getPackagesToInclude (packagesToInclude); + + if (packagesToInclude.empty()) + return; + + packagesConfigFile = getTargetFolder().getChildFile ("packages.config"); + + build_tools::writeStreamToFile (packagesConfigFile, [&packagesToInclude] (MemoryOutputStream& mo) { - packagesConfigFile = getTargetFolder().getChildFile ("packages.config"); + mo.setNewLineString ("\r\n"); - build_tools::writeStreamToFile (packagesConfigFile, [] (MemoryOutputStream& mo) + mo << "" << newLine + << "" << newLine; + + for (const auto& p : packagesToInclude) { - mo.setNewLineString ("\r\n"); + mo << " " << newLine - << "" << newLine - << "\t" << "" << newLine - << "" << newLine; - }); - } + if (p.targetFrameworkNative) + mo << " targetFramework=\"native\""; + + mo << " />" << newLine; + } + + mo << "" << newLine; + }); } static String prependDot (const String& filename)