diff options
author | Peter Kuemmel <syntheticpp@gmx.net> | 2012-06-08 20:01:57 (GMT) |
---|---|---|
committer | Peter Kuemmel <syntheticpp@gmx.net> | 2012-06-08 20:59:18 (GMT) |
commit | 941afa571c9f45c52bb935bad1c3b83fe415372e (patch) | |
tree | 85aeed7ac4e10f7404414d17316cf05670ed9516 | |
parent | 033a687acd828ad6667d154939ffdbc482ab047f (diff) | |
download | CMake-941afa571c9f45c52bb935bad1c3b83fe415372e.zip CMake-941afa571c9f45c52bb935bad1c3b83fe415372e.tar.gz CMake-941afa571c9f45c52bb935bad1c3b83fe415372e.tar.bz2 |
Ninja: allow spaces in source path
And make /showIncude prefix visible for all build rules
-rw-r--r-- | Modules/CMakeCCompiler.cmake.in | 5 | ||||
-rw-r--r-- | Modules/CMakeCXXCompiler.cmake.in | 5 | ||||
-rw-r--r-- | Modules/CMakeClDeps.cmake | 14 | ||||
-rw-r--r-- | Modules/CMakeDetermineCCompiler.cmake | 4 | ||||
-rw-r--r-- | Modules/CMakeDetermineCXXCompiler.cmake | 1 | ||||
-rw-r--r-- | Modules/Platform/Windows-cl.cmake | 18 | ||||
-rw-r--r-- | Source/cmGlobalNinjaGenerator.cxx | 14 | ||||
-rw-r--r-- | Source/cmNinjaTargetGenerator.cxx | 27 |
8 files changed, 37 insertions, 51 deletions
diff --git a/Modules/CMakeCCompiler.cmake.in b/Modules/CMakeCCompiler.cmake.in index b14cf34..7a17e18 100644 --- a/Modules/CMakeCCompiler.cmake.in +++ b/Modules/CMakeCCompiler.cmake.in @@ -48,3 +48,8 @@ SET(CMAKE_C_HAS_ISYSROOT "@CMAKE_C_HAS_ISYSROOT@") SET(CMAKE_C_IMPLICIT_LINK_LIBRARIES "@CMAKE_C_IMPLICIT_LINK_LIBRARIES@") SET(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "@CMAKE_C_IMPLICIT_LINK_DIRECTORIES@") + +IF(MSVC_CXX_ARCHITECTURE_ID) + SET(CMAKE_CMCLDEPS_EXECUTABLE "@CMAKE_CMCLDEPS_EXECUTABLE@") + SET(CMAKE_CL_SHOWINCLUDE_PREFIX "@CMAKE_CL_SHOWINCLUDE_PREFIX@") +ENDIF() diff --git a/Modules/CMakeCXXCompiler.cmake.in b/Modules/CMakeCXXCompiler.cmake.in index bc3bc2e..49a54d0 100644 --- a/Modules/CMakeCXXCompiler.cmake.in +++ b/Modules/CMakeCXXCompiler.cmake.in @@ -49,3 +49,8 @@ SET(CMAKE_CXX_HAS_ISYSROOT "@CMAKE_CXX_HAS_ISYSROOT@") SET(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "@CMAKE_CXX_IMPLICIT_LINK_LIBRARIES@") SET(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "@CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES@") + +IF(MSVC_CXX_ARCHITECTURE_ID) + SET(CMAKE_CMCLDEPS_EXECUTABLE "@CMAKE_CMCLDEPS_EXECUTABLE@") + SET(CMAKE_CL_SHOWINCLUDE_PREFIX "@CMAKE_CL_SHOWINCLUDE_PREFIX@") +ENDIF() diff --git a/Modules/CMakeClDeps.cmake b/Modules/CMakeClDeps.cmake new file mode 100644 index 0000000..435a6c5 --- /dev/null +++ b/Modules/CMakeClDeps.cmake @@ -0,0 +1,14 @@ +IF(MSVC_C_ARCHITECTURE_ID AND CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_C_COMPILER) + FIND_PROGRAM(CMAKE_CMCLDEPS_EXECUTABLE NAMES cmcldeps.exe) + SET(showdir ${CMAKE_BINARY_DIR}/CMakeFiles/ShowIncludes) + FILE(WRITE ${showdir}/foo.h "\n") + FILE(WRITE ${showdir}/main.c "#include \"foo.h\" \nint main(){}\n") + EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} /nologo /showIncludes ${showdir}/main.c + WORKING_DIRECTORY ${showdir} OUTPUT_VARIABLE showOut) + STRING(REPLACE main.c "" showOut1 ${showOut}) + STRING(REPLACE "/" "\\" header1 ${showdir}/foo.h) + STRING(TOLOWER ${header1} header2) + STRING(REPLACE ${header2} "" showOut2 ${showOut1}) + STRING(REPLACE "\n" "" showOut3 ${showOut2}) + SET(CMAKE_CL_SHOWINCLUDE_PREFIX ${showOut3} CACHE STRING "cl.exe's /showInclides prefix" FORCE) +ENDIF() diff --git a/Modules/CMakeDetermineCCompiler.cmake b/Modules/CMakeDetermineCCompiler.cmake index e2e268f..53f558e 100644 --- a/Modules/CMakeDetermineCCompiler.cmake +++ b/Modules/CMakeDetermineCCompiler.cmake @@ -165,9 +165,7 @@ ENDIF (CMAKE_CROSSCOMPILING AND "${CMAKE_C_COMPILER_ID}" MATCHES "GNU" AND NOT _CMAKE_TOOLCHAIN_PREFIX) - - - +INCLUDE(${CMAKE_ROOT}/Modules/CMakeClDeps.cmake) INCLUDE(CMakeFindBinUtils) IF(MSVC_C_ARCHITECTURE_ID) SET(SET_MSVC_C_ARCHITECTURE_ID diff --git a/Modules/CMakeDetermineCXXCompiler.cmake b/Modules/CMakeDetermineCXXCompiler.cmake index 8298369..7f8f3ec 100644 --- a/Modules/CMakeDetermineCXXCompiler.cmake +++ b/Modules/CMakeDetermineCXXCompiler.cmake @@ -173,6 +173,7 @@ ENDIF (CMAKE_CROSSCOMPILING AND "${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" AND NOT _CMAKE_TOOLCHAIN_PREFIX) +INCLUDE(${CMAKE_ROOT}/Modules/CMakeClDeps.cmake) INCLUDE(CMakeFindBinUtils) IF(MSVC_CXX_ARCHITECTURE_ID) SET(SET_MSVC_CXX_ARCHITECTURE_ID diff --git a/Modules/Platform/Windows-cl.cmake b/Modules/Platform/Windows-cl.cmake index eed4e52..be6abb6 100644 --- a/Modules/Platform/Windows-cl.cmake +++ b/Modules/Platform/Windows-cl.cmake @@ -251,21 +251,3 @@ IF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake") CONFIGURE_FILE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake.in ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCXXPlatform.cmake IMMEDIATE) ENDIF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake") - - -IF(CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_C_COMPILER) - # TODO try_compile doesn't need cmcldeps, find a better solution - if(NOT EXISTS ${CMAKE_TRY_COMPILE_SOURCE_DIR}/../ShowIncludes) - SET(showdir ${CMAKE_BINARY_DIR}/CMakeFiles/ShowIncludes) - FILE(WRITE ${showdir}/foo.h "\n") - FILE(WRITE ${showdir}/main.c "#include \"foo.h\" \nint main(){}\n") - EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} /nologo /showIncludes ${showdir}/main.c - WORKING_DIRECTORY ${showdir} OUTPUT_VARIABLE showOut) - STRING(REPLACE main.c "" showOut1 ${showOut}) - STRING(REPLACE "/" "\\" header1 ${showdir}/foo.h) - STRING(TOLOWER ${header1} header2) - STRING(REPLACE ${header2} "" showOut2 ${showOut1}) - STRING(REPLACE "\n" "" showOut3 ${showOut2}) - SET(CMAKE_CL_SHOWINCLUDE_PREFIX ${showOut3}) - ENDIF() -ENDIF() diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 9a2597b..648855c 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -458,8 +458,7 @@ void cmGlobalNinjaGenerator else if(*l == "RC") { // check if mingw is used - const char* cc = mf->GetDefinition("CMAKE_C_COMPILER"); - if(cc && std::string(cc).find("gcc.exe") != std::string::npos) + if(mf->IsOn("CMAKE_COMPILER_IS_MINGW")) { UsingMinGW = true; std::string rc = cmSystemTools::FindProgram("windres"); @@ -467,17 +466,6 @@ void cmGlobalNinjaGenerator rc = "windres.exe";; mf->AddDefinition("CMAKE_RC_COMPILER", rc.c_str()); } - else if (cc && std::string(cc).find("cl.exe") != std::string::npos) - { - const char* cmake = mf->GetDefinition("CMAKE_COMMAND"); - std::string bindir = cmake ? cmake : ""; - cmSystemTools::ReplaceString(bindir, "cmake.exe", ""); - std::vector<std::string> locations; - locations.push_back(bindir); - std::string cldeps = cmSystemTools::FindProgram("cmcldeps", locations); - if(!cldeps.empty()) - mf->AddDefinition("CMAKE_CMCLDEPS_EXECUTABLE", cldeps.c_str()); - } } this->cmGlobalGenerator::EnableLanguage(language, mf, optional); this->ResolveLanguageCompiler(*l, mf, optional); diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 6518727..75b3929 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -330,20 +330,14 @@ cmNinjaTargetGenerator vars.Defines = "$DEFINES"; vars.TargetPDB = "$TARGET_PDB"; - const char* cldeps = 0; - const char* showIncludePrefix = 0; - const char* cc = this->GetMakefile()->GetDefinition("CMAKE_C_COMPILER"); - if(cc && std::string(cc).find("cl.exe") != std::string::npos) - { - cldeps = this->GetMakefile()->GetDefinition("CMAKE_CMCLDEPS_EXECUTABLE"); - showIncludePrefix = this->GetMakefile()->GetDefinition("CMAKE_CL_SHOWINCLUDE_PREFIX"); - } + cmMakefile* mf = this->GetMakefile(); + const char* clDepsBinary = mf->GetDefinition("CMAKE_CMCLDEPS_EXECUTABLE"); + const char* clShowPrefix = mf->GetDefinition("CMAKE_CL_SHOWINCLUDE_PREFIX"); std::string depfile; std::string depfileFlagsName = "CMAKE_DEPFILE_FLAGS_" + language; - const char *depfileFlags = - this->GetMakefile()->GetDefinition(depfileFlagsName.c_str()); - if (depfileFlags || (cldeps && showIncludePrefix)) { + const char *depfileFlags = mf->GetDefinition(depfileFlagsName.c_str()); + if (depfileFlags || (clDepsBinary && clShowPrefix)) { std::string depfileFlagsStr = depfileFlags ? depfileFlags : ""; depfile = "$out.d"; cmSystemTools::ReplaceString(depfileFlagsStr, "<DEPFILE>", @@ -351,7 +345,7 @@ cmNinjaTargetGenerator cmSystemTools::ReplaceString(depfileFlagsStr, "<OBJECT>", "$out"); cmSystemTools::ReplaceString(depfileFlagsStr, "<CMAKE_C_COMPILER>", - this->GetMakefile()->GetDefinition("CMAKE_C_COMPILER")); + mf->GetDefinition("CMAKE_C_COMPILER")); flags += " " + depfileFlagsStr; } vars.Flags = flags.c_str(); @@ -361,8 +355,7 @@ cmNinjaTargetGenerator std::string compileCmdVar = "CMAKE_"; compileCmdVar += language; compileCmdVar += "_COMPILE_OBJECT"; - std::string compileCmd = - this->GetMakefile()->GetRequiredDefinition(compileCmdVar.c_str()); + std::string compileCmd = mf->GetRequiredDefinition(compileCmdVar.c_str()); std::vector<std::string> compileCmds; cmSystemTools::ExpandListArgument(compileCmd, compileCmds); @@ -373,10 +366,10 @@ cmNinjaTargetGenerator std::string cmdLine = this->GetLocalGenerator()->BuildCommandLine(compileCmds); - if(cldeps && showIncludePrefix) + if(clDepsBinary && clShowPrefix) { - std::string prefix = showIncludePrefix; - cmdLine = std::string(cldeps) + " $in $out.d $out " + "\"" + prefix + "\" " + cmdLine; + std::string prefix = clShowPrefix; + cmdLine = "\"" + std::string(clDepsBinary) + "\" $in $out.d $out \"" + prefix + "\" " + cmdLine; } // Write the rule for compiling file of the given language. |