From 1b3724a2c753d3a85c95473804ed9a89c1809e37 Mon Sep 17 00:00:00 2001
From: Melven Roehrig-Zoellner <Melven.Roehrig-Zoellner@DLR.de>
Date: Fri, 12 Feb 2016 00:00:10 +0100
Subject: [PATCH] CodeBlocks: improve support for different compilers

More elaborate selection of the "compiler" tag in the generated CodeBlocks project file.
* Fortran language support
* support for several of the predefined compilers recognized by CodeBlocks (16.01)
---
 Source/cmExtraCodeBlocksGenerator.cxx | 61 +++++++++++++++++++++++++++++++----
 1 file changed, 55 insertions(+), 6 deletions(-)

diff --git a/Source/cmExtraCodeBlocksGenerator.cxx b/Source/cmExtraCodeBlocksGenerator.cxx
index 9348ef2..b061987 100644
--- a/Source/cmExtraCodeBlocksGenerator.cxx
+++ b/Source/cmExtraCodeBlocksGenerator.cxx
@@ -684,18 +684,38 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout,
 std::string cmExtraCodeBlocksGenerator::GetCBCompilerId(const cmMakefile* mf)
 {
   // figure out which language to use
-  // for now care only for C and C++
-  std::string compilerIdVar = "CMAKE_CXX_COMPILER_ID";
-  if (this->GlobalGenerator->GetLanguageEnabled("CXX") == false)
+  // for now care only for C, C++, and Fortran
+
+  // projects with C/C++ and Fortran are handled as C/C++ projects
+  bool pureFortran = false;
+  std::string compilerIdVar;
+  if (this->GlobalGenerator->GetLanguageEnabled("CXX") == true)
+    {
+    compilerIdVar = "CMAKE_CXX_COMPILER_ID";
+    }
+  else if (this->GlobalGenerator->GetLanguageEnabled("C") == true)
     {
     compilerIdVar = "CMAKE_C_COMPILER_ID";
     }
+  else if (this->GlobalGenerator->GetLanguageEnabled("Fortran") == true)
+    {
+    compilerIdVar = "CMAKE_Fortran_COMPILER_ID";
+    pureFortran = true;
+    }
+
 
   std::string compilerId = mf->GetSafeDefinition(compilerIdVar);
   std::string compiler = "gcc";  // default to gcc
   if (compilerId == "MSVC")
     {
-    compiler = "msvc8";
+    if( mf->IsDefinitionSet("MSVC10") == true )
+        {
+        compiler = "msvc10";
+        }
+    else
+        {
+        compiler = "msvc8";
+        }
     }
   else if (compilerId == "Borland")
     {
@@ -707,15 +727,44 @@ std::string cmExtraCodeBlocksGenerator::GetCBCompilerId(const cmMakefile* mf)
     }
   else if (compilerId == "Intel")
     {
-    compiler = "icc";
+    if (pureFortran && mf->IsDefinitionSet("WIN32"))
+        {
+        compiler = "ifcwin"; // Intel Fortran for Windows (available in cbFortran)
+        }
+    else
+        {
+        compiler = "icc";
+        }
     }
   else if (compilerId == "Watcom" || compilerId == "OpenWatcom")
     {
     compiler = "ow";
     }
+  else if (compilerId == "Clang")
+    {
+    compiler = "clang";
+    }
+  else if (compilerId == "PGI")
+    {
+    if (pureFortran)
+        {
+        compiler = "pgifortran";
+        }
+    else
+        {
+        compiler = "pgi"; // does not exist as default in CodeBlocks 16.01
+        }
+    }
   else if (compilerId == "GNU")
     {
-    compiler = "gcc";
+    if (pureFortran)
+        {
+        compiler = "gfortran";
+        }
+    else
+        {
+        compiler = "gcc";
+        }
     }
   return compiler;
 }
-- 
1.9.5.msysgit.1

