Fix the case where cmake --build failed with two project cmds in one file.

This adds a test that uses two project commands in the same CMakeLists.txt
file.  It also adds a fix so that cmake --build will work in that case.
The fix sets the name of the last project command in the top level
CMakeLists.txt in the cache variable CMAKE_PROJECT_NAME.  This variable
is used by cmake --build to find the project name.
This commit is contained in:
Bill Hoffman 2011-12-15 21:56:34 -05:00 committed by Brad King
parent 0a6543d957
commit 5badf5f734
5 changed files with 30 additions and 9 deletions

View File

@ -47,9 +47,13 @@ bool cmProjectCommand
this->Makefile->AddDefinition("PROJECT_NAME", args[0].c_str()); this->Makefile->AddDefinition("PROJECT_NAME", args[0].c_str());
// Set the CMAKE_PROJECT_NAME variable to be the highest-level // Set the CMAKE_PROJECT_NAME variable to be the highest-level
// project name in the tree. This is always the first PROJECT // project name in the tree. If there are two project commands
// command encountered. // in the same CMakeLists.txt file, and it is the top level
if(!this->Makefile->GetDefinition("CMAKE_PROJECT_NAME")) // 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->AddDefinition("CMAKE_PROJECT_NAME", args[0].c_str());
this->Makefile->AddCacheDefinition this->Makefile->AddCacheDefinition

View File

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

View File

@ -220,11 +220,21 @@ IF(BUILD_TESTING)
SET(CMAKE_BUILD_TEST_SOURCE_DIR "${CMake_SOURCE_DIR}/Tests/COnly") 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_BINARY_DIR "${CMake_BINARY_DIR}/Tests/CMakeBuildCOnly")
SET(CMAKE_BUILD_TEST_EXE COnly)
CONFIGURE_FILE("${CMake_SOURCE_DIR}/Tests/CMakeBuildTest.cmake.in" CONFIGURE_FILE("${CMake_SOURCE_DIR}/Tests/CMakeBuildTest.cmake.in"
"${CMake_BINARY_DIR}/Tests/CMakeBuildTest.cmake" @ONLY) "${CMake_BINARY_DIR}/Tests/CMakeBuildTest.cmake" @ONLY)
ADD_TEST(CMakeBuildTest ${CMAKE_CMAKE_COMMAND} -P ADD_TEST(CMakeBuildTest ${CMAKE_CMAKE_COMMAND} -P
"${CMake_BINARY_DIR}/Tests/CMakeBuildTest.cmake") "${CMake_BINARY_DIR}/Tests/CMakeBuildTest.cmake")
LIST(APPEND TEST_BUILD_DIRS ${CMAKE_BUILD_TEST_BINARY_DIR}) 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) ADD_TEST_MACRO(Module.CheckTypeSize CheckTypeSize)

View File

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

View File

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