Переглянути джерело

Merge topic 'fix_double_project_cmake_build'

5badf5f Fix the case where cmake --build failed with two project cmds in one file.
David Cole 14 роки тому
батько
коміт
d6a33f6d38

+ 7 - 3
Source/cmProjectCommand.cxx

@@ -47,9 +47,13 @@ bool cmProjectCommand
   this->Makefile->AddDefinition("PROJECT_NAME", args[0].c_str());
 
   // Set the CMAKE_PROJECT_NAME variable to be the highest-level
-  // project name in the tree.  This is always the first PROJECT
-  // command encountered.
-  if(!this->Makefile->GetDefinition("CMAKE_PROJECT_NAME"))
+  // project name in the tree. If there are two project commands
+  // in the same CMakeLists.txt file, and it is the top level
+  // CMakeLists.txt file, then go with the last one, so that
+  // CMAKE_PROJECT_NAME will match PROJECT_NAME, and cmake --build
+  // will work.
+  if(!this->Makefile->GetDefinition("CMAKE_PROJECT_NAME")
+     || (this->Makefile->GetLocalGenerator()->GetParent() == 0) )
     {
     this->Makefile->AddDefinition("CMAKE_PROJECT_NAME", args[0].c_str());
     this->Makefile->AddCacheDefinition

+ 6 - 6
Tests/CMakeBuildTest.cmake.in

@@ -32,21 +32,21 @@ set(CMAKE_CONFIGURATION_TYPES @CMAKE_CONFIGURATION_TYPES@)
 # run the executable out of the Debug directory if there 
 # are configuration types
 if(CMAKE_CONFIGURATION_TYPES)
-  set(RUN_TEST "@CMAKE_BUILD_TEST_BINARY_DIR@/Debug/COnly")
+  set(RUN_TEST "@CMAKE_BUILD_TEST_BINARY_DIR@/Debug/@CMAKE_BUILD_TEST_EXE@")
 else(CMAKE_CONFIGURATION_TYPES)
-  set(RUN_TEST "@CMAKE_BUILD_TEST_BINARY_DIR@/COnly")
+  set(RUN_TEST "@CMAKE_BUILD_TEST_BINARY_DIR@/@CMAKE_BUILD_TEST_EXE@")
 endif(CMAKE_CONFIGURATION_TYPES)
 # run the test results
 message("running [${RUN_TEST}]")
 execute_process(COMMAND "${RUN_TEST}" RESULT_VARIABLE RESULT)
 if(RESULT)
-  message(FATAL_ERROR "Error running test COnly")
+  message(FATAL_ERROR "Error running test @CMAKE_BUILD_TEST_EXE@")
 endif(RESULT)
 
-# build it again with clean and only COnly target
+# build it again with clean and only @CMAKE_BUILD_TEST_EXE@ target
 execute_process(COMMAND "${CMAKE_COMMAND}" 
   --build "@CMAKE_BUILD_TEST_BINARY_DIR@" --config Debug 
-  --clean-first --target COnly
+  --clean-first --target @CMAKE_BUILD_TEST_EXE@
   RESULT_VARIABLE RESULT)
 if(RESULT)
   message(FATAL_ERROR "Error running cmake --build")
@@ -55,5 +55,5 @@ endif(RESULT)
 # run it again after clean 
 execute_process(COMMAND "${RUN_TEST}" RESULT_VARIABLE RESULT)
 if(RESULT)
-  message(FATAL_ERROR "Error running test COnly after clean ")
+  message(FATAL_ERROR "Error running test @CMAKE_BUILD_TEST_EXE@ after clean ")
 endif(RESULT)

+ 10 - 0
Tests/CMakeLists.txt

@@ -220,11 +220,21 @@ IF(BUILD_TESTING)
 
   SET(CMAKE_BUILD_TEST_SOURCE_DIR "${CMake_SOURCE_DIR}/Tests/COnly")
   SET(CMAKE_BUILD_TEST_BINARY_DIR "${CMake_BINARY_DIR}/Tests/CMakeBuildCOnly")
+  SET(CMAKE_BUILD_TEST_EXE COnly)
   CONFIGURE_FILE("${CMake_SOURCE_DIR}/Tests/CMakeBuildTest.cmake.in"
     "${CMake_BINARY_DIR}/Tests/CMakeBuildTest.cmake" @ONLY)
   ADD_TEST(CMakeBuildTest ${CMAKE_CMAKE_COMMAND} -P
     "${CMake_BINARY_DIR}/Tests/CMakeBuildTest.cmake")
   LIST(APPEND TEST_BUILD_DIRS ${CMAKE_BUILD_TEST_BINARY_DIR})
+  # now do it again for a project that has two project commands
+  SET(CMAKE_BUILD_TEST_SOURCE_DIR "${CMake_SOURCE_DIR}/Tests/DoubleProject")
+  SET(CMAKE_BUILD_TEST_BINARY_DIR "${CMake_BINARY_DIR}/Tests/DoubleProject")
+  SET(CMAKE_BUILD_TEST_EXE just_silly)
+  CONFIGURE_FILE("${CMake_SOURCE_DIR}/Tests/CMakeBuildTest.cmake.in"
+    "${CMake_BINARY_DIR}/Tests/CMakeBuildDoubleProjectTest.cmake" @ONLY)
+  ADD_TEST(CMakeDoubleProject ${CMAKE_CMAKE_COMMAND} -P
+    "${CMake_BINARY_DIR}/Tests/CMakeBuildDoubleProjectTest.cmake")
+  LIST(APPEND TEST_BUILD_DIRS ${CMAKE_BUILD_TEST_BINARY_DIR})
 
   ADD_TEST_MACRO(Module.CheckTypeSize CheckTypeSize)
 

+ 3 - 0
Tests/DoubleProject/CMakeLists.txt

@@ -0,0 +1,3 @@
+project(dumb)
+project(dumber)
+add_executable(just_silly silly.c)

+ 4 - 0
Tests/DoubleProject/silly.c

@@ -0,0 +1,4 @@
+int main()
+{
+  return 0;
+}