Просмотр исходного кода

Merge topic 'fix-ninja-rc-include-flags'

f4c5eade Ninja: Fix RC include directories regression
Brad King 11 лет назад
Родитель
Сommit
cea13d5536

+ 6 - 3
Source/cmLocalGenerator.cxx

@@ -1287,9 +1287,11 @@ cmLocalGenerator::ConvertToOutputForExisting(RelativeRoot remote,
 //----------------------------------------------------------------------------
 std::string
 cmLocalGenerator::ConvertToIncludeReference(std::string const& path,
-                                            OutputFormat format)
+                                            OutputFormat format,
+                                            bool forceFullPaths)
 {
-  return this->ConvertToOutputForExisting(path, START_OUTPUT, format);
+  return this->ConvertToOutputForExisting(
+    path, forceFullPaths? FULL : START_OUTPUT, format);
 }
 
 //----------------------------------------------------------------------------
@@ -1297,6 +1299,7 @@ std::string cmLocalGenerator::GetIncludeFlags(
                                      const std::vector<std::string> &includes,
                                      cmGeneratorTarget* target,
                                      const std::string& lang,
+                                     bool forceFullPaths,
                                      bool forResponseFile,
                                      const std::string& config)
 {
@@ -1401,7 +1404,7 @@ std::string cmLocalGenerator::GetIncludeFlags(
       flagUsed = true;
       }
     std::string includePath =
-      this->ConvertToIncludeReference(*i, shellFormat);
+      this->ConvertToIncludeReference(*i, shellFormat, forceFullPaths);
     if(quotePaths && includePath.size() && includePath[0] != '\"')
       {
       includeFlags << "\"";

+ 3 - 1
Source/cmLocalGenerator.h

@@ -160,6 +160,7 @@ public:
   std::string GetIncludeFlags(const std::vector<std::string> &includes,
                               cmGeneratorTarget* target,
                               const std::string& lang,
+                              bool forceFullPaths = false,
                               bool forResponseFile = false,
                               const std::string& config = "");
 
@@ -215,7 +216,8 @@ public:
                                          OutputFormat format = SHELL);
 
   virtual std::string ConvertToIncludeReference(std::string const& path,
-                                                OutputFormat format = SHELL);
+                                                OutputFormat format = SHELL,
+                                                bool forceFullPaths = false);
 
   /** Called from command-line hook to clear dependencies.  */
   virtual void ClearDependencies(cmMakefile* /* mf */,

+ 3 - 2
Source/cmLocalNinjaGenerator.cxx

@@ -151,9 +151,10 @@ cmLocalNinjaGenerator::ConvertToLinkReference(std::string const& lib,
 
 std::string
 cmLocalNinjaGenerator::ConvertToIncludeReference(std::string const& path,
-                                                 OutputFormat format)
+                                                 OutputFormat format,
+                                                 bool forceFullPaths)
 {
-  return this->Convert(path, HOME_OUTPUT, format);
+  return this->Convert(path, forceFullPaths? FULL : HOME_OUTPUT, format);
 }
 
 //----------------------------------------------------------------------------

+ 2 - 1
Source/cmLocalNinjaGenerator.h

@@ -108,7 +108,8 @@ public:
 
 protected:
   virtual std::string ConvertToIncludeReference(std::string const& path,
-                                                OutputFormat format = SHELL);
+                                                OutputFormat format = SHELL,
+                                                bool forceFullPaths = false);
 
 
 private:

+ 1 - 1
Source/cmMakefileTargetGenerator.cxx

@@ -1962,7 +1962,7 @@ void cmMakefileTargetGenerator::AddIncludeFlags(std::string& flags,
 
   std::string includeFlags =
     this->LocalGenerator->GetIncludeFlags(includes, this->GeneratorTarget,
-                                          lang, useResponseFile);
+                                          lang, false, useResponseFile);
   if(includeFlags.empty())
     {
     return;

+ 13 - 1
Tests/VSResource/CMakeLists.txt

@@ -18,6 +18,11 @@ if(CMAKE_RC_COMPILER MATCHES windres)
   message(STATUS "CMAKE_RC_COMPILER MATCHES windres")
   add_definitions(/DCMAKE_RCDEFINE=test.txt)
   add_definitions(/DCMAKE_RCDEFINE_NO_QUOTED_STRINGS)
+  if(MSYS AND CMAKE_CURRENT_BINARY_DIR MATCHES " ")
+    # windres cannot handle spaces in include dir, and
+    # for the MSys shell we do not convert to shortpath.
+    set(CMAKE_RC_NO_INCLUDE 1)
+  endif()
 elseif(MSVC60)
   # VS6 rc compiler does not deal well with spaces in a "/D" value, but it can
   # handle the quoting
@@ -30,10 +35,17 @@ else()
   set(TEXTFILE_FROM_SOURCE_DIR "textfile, spaces in name, from binary dir")
   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test.txt
     "${CMAKE_CURRENT_BINARY_DIR}/test with spaces.txt" @ONLY)
-  include_directories(${CMAKE_CURRENT_BINARY_DIR})
   add_definitions(/DCMAKE_RCDEFINE="test with spaces.txt")
 endif()
 
+if(CMAKE_RC_NO_INCLUDE)
+  add_definitions(/DCMAKE_RC_NO_INCLUDE)
+else()
+  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include.rc.in
+    "${CMAKE_CURRENT_BINARY_DIR}/include.rc" @ONLY)
+  include_directories(${CMAKE_CURRENT_BINARY_DIR})
+endif()
+
 add_executable(VSResource main.cpp test.rc)
 
 set_property(TARGET VSResource

+ 1 - 0
Tests/VSResource/include.rc.in

@@ -0,0 +1 @@
+// This file should be included.

+ 3 - 0
Tests/VSResource/test.rc

@@ -1,4 +1,7 @@
 #ifdef CMAKE_RCDEFINE
+# ifndef CMAKE_RC_NO_INCLUDE
+#  include <include.rc>
+# endif
 
 // This line can compile with either an unquoted or a quoted string
 1025 TEXTFILE CMAKE_RCDEFINE