diff --git a/BREAKING_CHANGES.md b/BREAKING_CHANGES.md index 2c1cee87ee..0fddbf7694 100644 --- a/BREAKING_CHANGES.md +++ b/BREAKING_CHANGES.md @@ -2,6 +2,23 @@ # Version 8.0.4 +## Change + +Support for Arm32 in Projucer has been removed for Windows targets. + +**Possible Issues** + +Projucer projects targeting Arm32 on Windows will no longer be able to select that option. + +**Workaround** + +Select Arm64 or Arm64EC instead of Arm32, and port any 32-bit specific code to 64-bit. + +**Rationale** + +32-bit Arm support has been deprecated in current versions of Windows 11. + + ## Change The Javascript implementation has been moved into a independent juce module. diff --git a/extras/Projucer/Source/Project/jucer_Project.h b/extras/Projucer/Source/Project/jucer_Project.h index 84fc56c563..a3ce2124bc 100644 --- a/extras/Projucer/Source/Project/jucer_Project.h +++ b/extras/Projucer/Source/Project/jucer_Project.h @@ -59,6 +59,7 @@ namespace ProjectMessages DECLARE_ID (pluginCodeInvalid); DECLARE_ID (manufacturerCodeInvalid); DECLARE_ID (deprecatedExporter); + DECLARE_ID (unsupportedArm32Config); DECLARE_ID (notification); DECLARE_ID (warning); @@ -73,7 +74,7 @@ namespace ProjectMessages static Identifier warnings[] = { Ids::cppStandard, Ids::moduleNotFound, Ids::jucePath, Ids::jucerFileModified, Ids::missingModuleDependencies, Ids::oldProjucer, Ids::pluginCodeInvalid, Ids::manufacturerCodeInvalid, - Ids::deprecatedExporter }; + Ids::deprecatedExporter, Ids::unsupportedArm32Config }; if (std::find (std::begin (warnings), std::end (warnings), message) != std::end (warnings)) return Ids::warning; @@ -99,6 +100,7 @@ namespace ProjectMessages if (message == Ids::pluginCodeInvalid) return "Invalid Plugin Code"; if (message == Ids::manufacturerCodeInvalid) return "Invalid Manufacturer Code"; if (message == Ids::deprecatedExporter) return "Deprecated Exporter"; + if (message == Ids::unsupportedArm32Config) return "Unsupported Architecture"; jassertfalse; return {}; @@ -116,6 +118,7 @@ namespace ProjectMessages if (message == Ids::pluginCodeInvalid) return "The plugin code should be exactly four characters in length."; if (message == Ids::manufacturerCodeInvalid) return "The manufacturer code should be exactly four characters in length."; if (message == Ids::deprecatedExporter) return "The project includes a deprecated exporter."; + if (message == Ids::unsupportedArm32Config) return "The project includes a Visual Studio configuration that uses the 32-bit Arm architecture, which is no longer supported. This configuration has been hidden, and will be removed on save."; jassertfalse; return {}; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h index 626df52908..455d8d113e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h @@ -148,6 +148,24 @@ public: config->getValue (Ids::targetName) = oldStyleLibName; } + { + std::vector toErase; + + for (const auto& config : getConfigurations()) + { + if (config.getProperty (Ids::winArchitecture) == "ARM") + toErase.push_back (config); + } + + if (! toErase.empty()) + { + for (const auto& e : toErase) + e.getParent().removeChild (e, nullptr); + + getProject().addProjectMessage (ProjectMessages::Ids::unsupportedArm32Config, {}); + } + } + for (ConfigIterator i (*this); i.next();) dynamic_cast (*i).updateOldLTOSetting(); } @@ -214,7 +232,6 @@ public: String getIntel64BitArchName() const { return "x64"; } String getIntel32BitArchName() const { return "Win32"; } String getArm64BitArchName() const { return "ARM64"; } - String getArm32BitArchName() const { return "ARM"; } String getArchitectureString() const { return architectureTypeValue.get(); } String getDebugInformationFormatString() const { return debugInformationFormatValue.get(); } @@ -258,8 +275,8 @@ public: addVisualStudioPluginInstallPathProperties (props); props.add (new ChoicePropertyComponent (architectureTypeValue, "Architecture", - { getIntel32BitArchName(), getIntel64BitArchName(), getArm32BitArchName(), getArm64BitArchName() }, - { getIntel32BitArchName(), getIntel64BitArchName(), getArm32BitArchName(), getArm64BitArchName() }), + { getIntel32BitArchName(), getIntel64BitArchName(), getArm64BitArchName() }, + { getIntel32BitArchName(), getIntel64BitArchName(), getArm64BitArchName() }), "Which Windows architecture to use."); props.add (new ChoicePropertyComponentWithEnablement (debugInformationFormatValue, @@ -399,7 +416,6 @@ public: { { "Win32", { "%programfiles(x86)%", "%CommonProgramFiles(x86)%" } }, { "x64", { "%ProgramW6432%", "%CommonProgramW6432%" } }, - { "ARM", { "%programfiles(arm)%", "%CommonProgramFiles(arm)%" } }, { "ARM64", { "%ProgramW6432%", "%CommonProgramW6432%" } } };