[Cmake-commits] CMake branch, master, updated. v3.15.2-971-gefbd503

Kitware Robot kwrobot at kitware.com
Wed Sep 4 08:51:52 EDT 2019


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, master has been updated
       via  efbd50383386c00cde63a7b67672b8487b00980f (commit)
       via  fb9da8e6f421263e8904e8d12586bf7b068ed3b4 (commit)
      from  2b478a921aedd55c2596bc0cb083ffea7244bb0e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=efbd50383386c00cde63a7b67672b8487b00980f
commit efbd50383386c00cde63a7b67672b8487b00980f
Merge: 2b478a9 fb9da8e
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Wed Sep 4 12:49:44 2019 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Wed Sep 4 08:50:19 2019 -0400

    Merge topic 'fortran-INCLUDE-defines'
    
    fb9da8e6f4 Ninja: Pass preprocessor definitions when compiling with Intel Fortran
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !3764


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fb9da8e6f421263e8904e8d12586bf7b068ed3b4
commit fb9da8e6f421263e8904e8d12586bf7b068ed3b4
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Aug 30 15:30:51 2019 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Tue Sep 3 14:20:26 2019 -0400

    Ninja: Pass preprocessor definitions when compiling with Intel Fortran
    
    The Intel Fortran compiler supports an extension that allows conditional
    compilation based on preprocessor definitions specified on the command
    line even when not preprocessing.
    
    Fixes: #19664

diff --git a/Modules/Compiler/Intel-Fortran.cmake b/Modules/Compiler/Intel-Fortran.cmake
index 5275ddf..156b533 100644
--- a/Modules/Compiler/Intel-Fortran.cmake
+++ b/Modules/Compiler/Intel-Fortran.cmake
@@ -8,6 +8,8 @@ set(CMAKE_Fortran_MODDIR_FLAG "-module ")
 set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-fixed")
 set(CMAKE_Fortran_FORMAT_FREE_FLAG "-free")
 
+set(CMAKE_Fortran_COMPILE_WITH_DEFINES 1)
+
 set(CMAKE_Fortran_CREATE_PREPROCESSED_SOURCE "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
 set(CMAKE_Fortran_CREATE_ASSEMBLY_SOURCE "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
 
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 29e8b74..90b59e7 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -108,6 +108,13 @@ bool cmNinjaTargetGenerator::UsePreprocessedSource(
   return lang == "Fortran";
 }
 
+bool cmNinjaTargetGenerator::CompilePreprocessedSourceWithDefines(
+  std::string const& lang) const
+{
+  return this->Makefile->IsOn(
+    cmStrCat("CMAKE_", lang, "_COMPILE_WITH_DEFINES"));
+}
+
 std::string cmNinjaTargetGenerator::LanguageDyndepRule(
   const std::string& lang) const
 {
@@ -458,12 +465,14 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang)
   vars.ObjectDir = "$OBJECT_DIR";
   vars.ObjectFileDir = "$OBJECT_FILE_DIR";
 
+  cmMakefile* mf = this->GetMakefile();
+
   // For some cases we do an explicit preprocessor invocation.
   bool const explicitPP = this->NeedExplicitPreprocessing(lang);
+  bool const compilePPWithDefines = this->UsePreprocessedSource(lang) &&
+    this->CompilePreprocessedSourceWithDefines(lang);
   bool const needDyndep = this->NeedDyndep(lang);
 
-  cmMakefile* mf = this->GetMakefile();
-
   std::string flags = "$FLAGS";
 
   std::string responseFlag;
@@ -517,9 +526,14 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang)
     // Preprocessing and compilation use the same flags.
     std::string ppFlags = flags;
 
-    // Move preprocessor definitions to the preprocessor rule.
-    ppVars.Defines = vars.Defines;
-    vars.Defines = "";
+    if (!compilePPWithDefines) {
+      // Move preprocessor definitions to the preprocessor rule.
+      ppVars.Defines = vars.Defines;
+      vars.Defines = "";
+    } else {
+      // Copy preprocessor definitions to the preprocessor rule.
+      ppVars.Defines = vars.Defines;
+    }
 
     // Copy include directories to the preprocessor rule.  The Fortran
     // compilation rule still needs them for the INCLUDE directive.
@@ -1011,6 +1025,8 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
     ppBuild.RspFile = ppFileName + ".rsp";
 
     bool const compilePP = this->UsePreprocessedSource(language);
+    bool const compilePPWithDefines =
+      compilePP && this->CompilePreprocessedSourceWithDefines(language);
     if (compilePP) {
       // Move compilation dependencies to the preprocessing build statement.
       std::swap(ppBuild.ExplicitDeps, objBuild.ExplicitDeps);
@@ -1039,7 +1055,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
       this->LocalGenerator->AppendFlags(vars["FLAGS"], postFlag);
     }
 
-    if (compilePP) {
+    if (compilePP && !compilePPWithDefines) {
       // Move preprocessor definitions to the preprocessor build statement.
       std::swap(ppBuild.Variables["DEFINES"], vars["DEFINES"]);
     } else {
diff --git a/Source/cmNinjaTargetGenerator.h b/Source/cmNinjaTargetGenerator.h
index a99d8e7..e304bc7 100644
--- a/Source/cmNinjaTargetGenerator.h
+++ b/Source/cmNinjaTargetGenerator.h
@@ -70,6 +70,7 @@ protected:
   std::string LanguageDyndepRule(std::string const& lang) const;
   bool NeedDyndep(std::string const& lang) const;
   bool UsePreprocessedSource(std::string const& lang) const;
+  bool CompilePreprocessedSourceWithDefines(std::string const& lang) const;
 
   std::string OrderDependsTargetForTarget();
 
diff --git a/Tests/FortranOnly/CMakeLists.txt b/Tests/FortranOnly/CMakeLists.txt
index 45372dd..de887fa 100644
--- a/Tests/FortranOnly/CMakeLists.txt
+++ b/Tests/FortranOnly/CMakeLists.txt
@@ -112,3 +112,11 @@ if("${CMAKE_GENERATOR}" MATCHES "Makefile" AND CMAKE_MAKE_PROGRAM)
       )
   endif()
 endif()
+
+# Test that with Intel Fortran we always compile with preprocessor
+# defines even if splitting the preprocessing and compilation steps.
+if(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
+  add_executable(IntelIfDef IntelIfDef.f)
+  set_property(TARGET IntelIfDef PROPERTY Fortran_FORMAT FIXED)
+  target_compile_definitions(IntelIfDef PRIVATE SOME_DEF)
+endif()
diff --git a/Tests/FortranOnly/IntelIfDef.f b/Tests/FortranOnly/IntelIfDef.f
new file mode 100644
index 0000000..d7a73d1
--- /dev/null
+++ b/Tests/FortranOnly/IntelIfDef.f
@@ -0,0 +1,3 @@
+        INCLUDE 'IntelIfDef.inc'
+        PROGRAM IntelIfDef
+        END
diff --git a/Tests/FortranOnly/IntelIfDef.inc b/Tests/FortranOnly/IntelIfDef.inc
new file mode 100644
index 0000000..52edafa
--- /dev/null
+++ b/Tests/FortranOnly/IntelIfDef.inc
@@ -0,0 +1,3 @@
+CDEC$   IF .NOT. DEFINED(SOME_DEF)
+CDEC$     INCLUDE 'SOME_DEF not defined'
+CDEC$   END IF

-----------------------------------------------------------------------

Summary of changes:
 Modules/Compiler/Intel-Fortran.cmake |  2 ++
 Source/cmNinjaTargetGenerator.cxx    | 28 ++++++++++++++++++++++------
 Source/cmNinjaTargetGenerator.h      |  1 +
 Tests/FortranOnly/CMakeLists.txt     |  8 ++++++++
 Tests/FortranOnly/IntelIfDef.f       |  3 +++
 Tests/FortranOnly/IntelIfDef.inc     |  3 +++
 6 files changed, 39 insertions(+), 6 deletions(-)
 create mode 100644 Tests/FortranOnly/IntelIfDef.f
 create mode 100644 Tests/FortranOnly/IntelIfDef.inc


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list