cmake: Fix --build <relative-dir> for VS generators (#15609)

The VS >= 10 generators need to parse the .sln file from the build
directory to locate targets in subdirectories.  This occurs after we
change the working directory to the build tree.  If a relative directory
other than "." was given then we would change to it and also refer to
the .sln file location with it.  Fix this by converting the build tree
to a full path always.  This will also give a more informative error
message when the directory does not exist.
This commit is contained in:
Brad King 2015-06-11 15:01:12 -04:00
parent 7195ec92b2
commit 90ad087ab9
6 changed files with 25 additions and 1 deletions

View File

@ -420,7 +420,7 @@ static int do_build(int ac, char const* const* av)
switch (doing) switch (doing)
{ {
case DoingDir: case DoingDir:
dir = av[i]; dir = cmSystemTools::CollapseFullPath(av[i]);
doing = DoingNone; doing = DoingNone;
break; break;
case DoingTarget: case DoingTarget:

View File

@ -0,0 +1 @@
add_subdirectory(BuildDir)

View File

@ -0,0 +1,5 @@
add_custom_command(
OUTPUT output.txt
COMMAND ${CMAKE_COMMAND} -E echo CustomCommand > output.txt
)
add_custom_target(CustomTarget ALL DEPENDS output.txt)

View File

@ -28,9 +28,24 @@ run_cmake_command(build-no-cache
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}) ${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR})
run_cmake_command(build-no-generator run_cmake_command(build-no-generator
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-no-generator) ${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-no-generator)
run_cmake_command(build-bad-dir
${CMAKE_COMMAND} --build dir-does-not-exist)
run_cmake_command(build-bad-generator run_cmake_command(build-bad-generator
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-generator) ${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-generator)
function(run_BuildDir)
# Use a single build tree for a few tests without cleaning.
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/BuildDir-build)
set(RunCMake_TEST_NO_CLEAN 1)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
run_cmake(BuildDir)
run_cmake_command(BuildDir--build ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --target CustomTarget)
endfunction()
run_BuildDir()
if(RunCMake_GENERATOR STREQUAL "Ninja") if(RunCMake_GENERATOR STREQUAL "Ninja")
# Use a single build tree for a few tests without cleaning. # Use a single build tree for a few tests without cleaning.
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Build-build) set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Build-build)

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,2 @@
^Error: [^
]+/Tests/RunCMake/CommandLine/build-bad-dir-build/dir-does-not-exist is not a directory$