Jelajahi Sumber

Makefiles: Fix CMAKE_EXPORT_COMPILE_COMMANDS crash with custom compile rule

Extend the fix from commit 67e2130c96 (Makefiles: Fix
CMAKE_EXPORT_COMPILE_COMMANDS crash with custom compile rule,
2020-11-20, v3.19.1~8^2) to work for the `<FLAGS>` placeholder too.
Also fix the test case to actually enable `EXPORT_COMPILE_COMMANDS`
on the test target.

Fixes: #22261
Brad King 4 tahun lalu
induk
melakukan
316cbbe8d5

+ 5 - 2
Source/cmMakefileTargetGenerator.cxx

@@ -926,8 +926,11 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
                                                    compileCommand, vars);
       std::string workingDirectory =
         this->LocalGenerator->GetCurrentBinaryDirectory();
-      compileCommand.replace(compileCommand.find(langFlags), langFlags.size(),
-                             this->GetFlags(lang, this->GetConfigName()));
+      std::string::size_type lfPos = compileCommand.find(langFlags);
+      if (lfPos != std::string::npos) {
+        compileCommand.replace(lfPos, langFlags.size(),
+                               this->GetFlags(lang, this->GetConfigName()));
+      }
       std::string langDefines = std::string("$(") + lang + "_DEFINES)";
       std::string::size_type ldPos = compileCommand.find(langDefines);
       if (ldPos != std::string::npos) {

+ 2 - 1
Tests/RunCMake/ExportCompileCommands/CustomCompileRule.cmake

@@ -1,5 +1,6 @@
 enable_language(C)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 add_library(empty STATIC empty.c)
 string(REPLACE "<DEFINES>" "" CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT}")
 string(REPLACE "<INCLUDES>" "" CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT}")
-set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+string(REPLACE "<FLAGS>" "" CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT}")