1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

Projucer: Add support for Windows MIDI Services nuget package

This commit is contained in:
reuk 2025-03-05 17:54:22 +00:00
parent 2c057f1dee
commit c93f999f13
No known key found for this signature in database
2 changed files with 91 additions and 30 deletions

View file

@ -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<const MSVCBuildConfiguration*> (&*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<NuGetPackage> 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<NuGetPackage>& 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<NuGetPackage> 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 << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << newLine
<< "<packages>" << newLine;
for (const auto& p : packagesToInclude)
{
mo.setNewLineString ("\r\n");
mo << " <package id=" << p.name.quoted() << " version=" << p.version.quoted();
mo << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << newLine
<< "<packages>" << newLine
<< "\t" << "<package id=" << getWebView2PackageName().quoted()
<< " version=" << getWebView2PackageVersion().quoted()
<< " />" << newLine
<< "</packages>" << newLine;
});
}
if (p.targetFrameworkNative)
mo << " targetFramework=\"native\"";
mo << " />" << newLine;
}
mo << "</packages>" << newLine;
});
}
static String prependDot (const String& filename)