Browse Source

VS: Default Intel Fortran projects to ifx in VS 18 and above

Intel oneAPI distributions no longer include the `ifort` compiler, but
its Visual Studio Integration defaults to `ifort` if `ifx` is not
explicitly specified in the `.vfproj` file.  We cannot change the
default Fortran compiler in VS 17 and older, but since the VS 18
generator is new, we can establish `ifx` as its default.  This
establishes working defaults on new versions of VS and oneAPI while
retaining existing behavior on older versions.

Issue: #26415
Brad King 2 months ago
parent
commit
eae0a053f5

+ 8 - 1
Help/variable/CMAKE_VS_PLATFORM_TOOLSET_FORTRAN.rst

@@ -9,4 +9,11 @@ Fortran compiler to be used by Visual Studio projects.
 that have the required Visual Studio Integration feature installed.  The
 compiler may be specified by a field in :variable:`CMAKE_GENERATOR_TOOLSET` of
 the form ``fortran=...``. CMake provides the selected Fortran compiler in this
-variable. The value may be empty if the field was not specified.
+variable.
+
+If the field was not specified, the default depends on the generator:
+
+* On :generator:`Visual Studio 18 2026` and above, the default is ``ifx``.
+
+* On older :ref:`Visual Studio Generators`, the default is empty, which the
+  Intel Visual Studio Integration interprets as equivalent to ``ifort``.

+ 9 - 0
Source/cmGlobalVisualStudio10Generator.cxx

@@ -797,6 +797,15 @@ std::string const& cmGlobalVisualStudio10Generator::
   return this->GeneratorToolsetCudaVSIntegrationSubdir;
 }
 
+cm::optional<std::string>
+cmGlobalVisualStudio10Generator::GetPlatformToolsetFortran() const
+{
+  if (this->GeneratorToolsetFortran) {
+    return this->GeneratorToolsetFortran;
+  }
+  return this->DefaultToolsetFortran;
+}
+
 cmGlobalVisualStudio10Generator::AuxToolset
 cmGlobalVisualStudio10Generator::FindAuxToolset(std::string&,
                                                 std::string&) const

+ 2 - 4
Source/cmGlobalVisualStudio10Generator.h

@@ -94,10 +94,7 @@ public:
   std::string const& GetPlatformToolsetCudaVSIntegrationSubdirString() const;
 
   /** The fortran toolset name.  */
-  cm::optional<std::string> GetPlatformToolsetFortran() const override
-  {
-    return this->GeneratorToolsetFortran;
-  }
+  cm::optional<std::string> GetPlatformToolsetFortran() const override;
 
   /** Return whether we need to use No/Debug instead of false/true
       for GenerateDebugInformation.  */
@@ -234,6 +231,7 @@ protected:
   std::string GeneratorToolsetCudaNvccSubdir;
   std::string GeneratorToolsetCudaVSIntegrationSubdir;
   cm::optional<std::string> GeneratorToolsetFortran;
+  cm::optional<std::string> DefaultToolsetFortran;
   std::string DefaultPlatformToolset;
   std::string DefaultPlatformToolsetHostArchitecture;
   std::string DefaultAndroidToolset;

+ 3 - 0
Source/cmGlobalVisualStudioVersionedGenerator.cxx

@@ -513,6 +513,9 @@ cmGlobalVisualStudioVersionedGenerator::cmGlobalVisualStudioVersionedGenerator(
     // Use a version installed by VS 2022 without a separate component.
     this->DefaultTargetFrameworkVersion = "v4.7.2";
   }
+  if (this->Version >= cmGlobalVisualStudioGenerator::VSVersion::VS18) {
+    this->DefaultToolsetFortran = "ifx";
+  }
 }
 
 bool cmGlobalVisualStudioVersionedGenerator::MatchesGeneratorName(