소스 검색

Ninja: Fix references to source files in gfortran diagnostics

The Ninja generator preprocesses and compiles separately for Fortran.
When compiling, tell gfortran that the source is already preprocessed so
that it will honor the `# <line>` directives when producing diagnostics
messages.

Fixes: #17160
Raul Laasner 8 년 전
부모
커밋
90a34ff791
2개의 변경된 파일9개의 추가작업 그리고 1개의 파일을 삭제
  1. 2 0
      Modules/Compiler/GNU-Fortran.cmake
  2. 7 1
      Source/cmNinjaTargetGenerator.cxx

+ 2 - 0
Modules/Compiler/GNU-Fortran.cmake

@@ -7,6 +7,8 @@ set(CMAKE_Fortran_PREPROCESS_SOURCE
 set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-ffixed-form")
 set(CMAKE_Fortran_FORMAT_FREE_FLAG "-ffree-form")
 
+set(CMAKE_Fortran_POSTPROCESS_FLAG "-fpreprocessed")
+
 # No -DNDEBUG for Fortran.
 string(APPEND CMAKE_Fortran_FLAGS_MINSIZEREL_INIT " -Os")
 string(APPEND CMAKE_Fortran_FLAGS_RELEASE_INIT " -O3")

+ 7 - 1
Source/cmNinjaTargetGenerator.cxx

@@ -891,9 +891,15 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
     // The actual compilation will now use the preprocessed source.
     explicitDeps.push_back(ppFileName);
 
-    // Preprocessing and compilation use the same flags.
+    // Preprocessing and compilation generally use the same flags.
     ppVars["FLAGS"] = vars["FLAGS"];
 
+    // In case compilation requires flags that are incompatible with
+    // preprocessing, include them here.
+    std::string const postFlag =
+      this->Makefile->GetSafeDefinition("CMAKE_Fortran_POSTPROCESS_FLAG");
+    this->LocalGenerator->AppendFlags(vars["FLAGS"], postFlag);
+
     // Move preprocessor definitions to the preprocessor build statement.
     std::swap(ppVars["DEFINES"], vars["DEFINES"]);