|
|
@@ -1,34 +1,246 @@
|
|
|
include(RunCMake)
|
|
|
|
|
|
+function(run_symlink_test_case)
|
|
|
+ file(REMOVE_RECURSE
|
|
|
+ "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt"
|
|
|
+ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles"
|
|
|
+ )
|
|
|
+ run_cmake_with_options(${ARGN})
|
|
|
+endfunction()
|
|
|
+
|
|
|
# This function assumes that ``${RunCMake_BINARY_DIR}/${name}/source`` and
|
|
|
# ``${RunCMake_BINARY_DIR}/${name}/binary`` are set up properly prior to
|
|
|
# calling it.
|
|
|
-function (run_symlink_test name)
|
|
|
+function (run_symlink_test case src bin src_from_bin bin_from_src)
|
|
|
+ string(REGEX REPLACE "-.*" "" name "${case}")
|
|
|
set(RunCMake_TEST_NO_CLEAN TRUE)
|
|
|
+ set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/${name}/${src}")
|
|
|
+ set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${name}/${bin}")
|
|
|
configure_file(
|
|
|
"${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt"
|
|
|
- "${RunCMake_BINARY_DIR}/${name}/source/CMakeLists.txt"
|
|
|
+ "${RunCMake_TEST_SOURCE_DIR}/CMakeLists.txt"
|
|
|
COPYONLY)
|
|
|
- set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/${name}/source")
|
|
|
- set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${name}/binary")
|
|
|
+
|
|
|
+ # We explicitly pass the source directory argument for each case.
|
|
|
+ set(RunCMake_TEST_NO_SOURCE_DIR 1)
|
|
|
+
|
|
|
+ # Test running in binary directory.
|
|
|
+ set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
|
|
# Emulate a shell using this directory.
|
|
|
- set(ENV{PWD} "${RunCMake_TEST_BINARY_DIR}")
|
|
|
- set(RunCMake_TEST_OPTIONS
|
|
|
- "-Dinclude_dir:PATH=${CMAKE_CURRENT_LIST_DIR}")
|
|
|
- run_cmake("${name}_symlinks")
|
|
|
+ set(ENV{PWD} "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}")
|
|
|
+
|
|
|
+ # Pass absolute path to the source tree, plain.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " $abs/${name}/${src}")
|
|
|
+ run_symlink_test_case("${case}" "${RunCMake_TEST_SOURCE_DIR}")
|
|
|
+
|
|
|
+ # Pass absolute path to the source tree, with -S.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " -S $abs/${name}/${src}")
|
|
|
+ run_symlink_test_case("${case}" -S "${RunCMake_TEST_SOURCE_DIR}")
|
|
|
+
|
|
|
+ # Pass relative path to the source tree, plain.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " ${src_from_bin}")
|
|
|
+ run_symlink_test_case("${case}" "${src_from_bin}")
|
|
|
+
|
|
|
+ # Pass relative path to the source tree, with -S.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " -S ${src_from_bin}")
|
|
|
+ run_symlink_test_case("${case}" -S "${src_from_bin}")
|
|
|
+
|
|
|
+ # Test running in source directory.
|
|
|
+ set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}")
|
|
|
+ # Emulate a shell using this directory.
|
|
|
+ set(ENV{PWD} "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}")
|
|
|
+
|
|
|
+ # Pass absolute path to the binary tree with -B.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " -B $abs/${name}/${bin}")
|
|
|
+ run_symlink_test_case("${case}" -B "${RunCMake_TEST_BINARY_DIR}")
|
|
|
+
|
|
|
+ # Pass relative path to the binary tree with -B.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " -B ${bin_from_src}")
|
|
|
+ run_symlink_test_case("${case}" -B "${bin_from_src}")
|
|
|
+
|
|
|
+ # Test running in another directory.
|
|
|
+ set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_BINARY_DIR}/${name}")
|
|
|
+ # Emulate a shell using this directory.
|
|
|
+ set(ENV{PWD} "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}")
|
|
|
+
|
|
|
+ # Pass absolute paths to the source and binary trees.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " -S $abs/${name}/${src} -B $abs/${name}/${bin}")
|
|
|
+ run_symlink_test_case("${case}" -S "${RunCMake_TEST_SOURCE_DIR}" -B "${RunCMake_TEST_BINARY_DIR}")
|
|
|
+
|
|
|
+ # Pass relative paths to the source and binary trees.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " -S ${src} -B ${bin}")
|
|
|
+ run_symlink_test_case("${case}" -S "${src}" -B "${bin}")
|
|
|
+
|
|
|
+ # Pass relative paths to the source and binary trees.
|
|
|
+ set(RunCMake_TEST_VARIANT_DESCRIPTION " -S ../${name}/${src} -B ../${name}/${bin}")
|
|
|
+ run_symlink_test_case("${case}" -S "../${name}/${src}" -B "../${name}/${bin}")
|
|
|
+
|
|
|
+ # Verify paths passed to compiler.
|
|
|
+ if(case MATCHES "^(different|asymmetric)-bin_in_src$")
|
|
|
+ # FIXME: Some generators compute incorrect relative paths.
|
|
|
+ message(STATUS "${case}-exe - SKIPPED")
|
|
|
+ message(STATUS "${case}-exe-build - SKIPPED")
|
|
|
+ return()
|
|
|
+ endif()
|
|
|
+ if(case MATCHES "^(different|asymmetric)-src_in_bin$" AND RunCMake_GENERATOR STREQUAL "Xcode")
|
|
|
+ # FIXME: The Xcode generator computes an incorrect relative path.
|
|
|
+ message(STATUS "${case}-exe - SKIPPED")
|
|
|
+ message(STATUS "${case}-exe-build - SKIPPED")
|
|
|
+ return()
|
|
|
+ endif()
|
|
|
+ unset(RunCMake_TEST_VARIANT_DESCRIPTION)
|
|
|
+ run_symlink_test_case("${case}-exe" -S "${src}" -B "${bin}")
|
|
|
+ if (RunCMake_GENERATOR MATCHES "Xcode")
|
|
|
+ # The native build system may pass the real paths.
|
|
|
+ set(RunCMake-stdout-file "generic-exe-build-stdout.txt")
|
|
|
+ endif()
|
|
|
+ set(RunCMake_TEST_OUTPUT_MERGE 1)
|
|
|
+ run_cmake_command("${case}-exe-build" ${CMAKE_COMMAND} --build "${bin}")
|
|
|
endfunction ()
|
|
|
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../none/source
|
|
|
+# .../none/binary
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/none")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/source")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/binary")
|
|
|
+run_symlink_test(none-separate "source" "binary" "../source" "../binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../none/source
|
|
|
+# .../none/source/binary
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/none")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/source")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/source/binary")
|
|
|
+run_symlink_test(none-bin_in_src "source" "source/binary" ".." "binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../none/binary
|
|
|
+# .../none/binary/source
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/none")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/binary")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/binary/source")
|
|
|
+run_symlink_test(none-src_in_bin "binary/source" "binary" "source" "..")
|
|
|
+
|
|
|
# Create the following structure:
|
|
|
#
|
|
|
# .../common_real/source
|
|
|
# .../common_real/binary
|
|
|
# .../common -> common_real
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/common_real")
|
|
|
+file(REMOVE "${RunCMake_BINARY_DIR}/common")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/source")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/binary")
|
|
|
+file(CREATE_LINK "common_real" "${RunCMake_BINARY_DIR}/common" SYMBOLIC)
|
|
|
+run_symlink_test(common-separate "source" "binary" "../source" "../binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
#
|
|
|
-# In this case, CMake should act as if .../common *is* .../common_real for all
|
|
|
-# computations except ``REALPATH``. This supports the case where a system has
|
|
|
-# a stable *symlink*, but not a stable target for that symlink.
|
|
|
+# .../common_real/source
|
|
|
+# .../common_real/source/binary
|
|
|
+# .../common -> common_real
|
|
|
file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/common_real")
|
|
|
file(REMOVE "${RunCMake_BINARY_DIR}/common")
|
|
|
file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/source")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/source/binary")
|
|
|
file(CREATE_LINK "common_real" "${RunCMake_BINARY_DIR}/common" SYMBOLIC)
|
|
|
-run_symlink_test(common)
|
|
|
+run_symlink_test(common-bin_in_src "source" "source/binary" ".." "binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../common_real/binary
|
|
|
+# .../common_real/binary/source
|
|
|
+# .../common -> common_real
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/common_real")
|
|
|
+file(REMOVE "${RunCMake_BINARY_DIR}/common")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/binary")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/binary/source")
|
|
|
+file(CREATE_LINK "common_real" "${RunCMake_BINARY_DIR}/common" SYMBOLIC)
|
|
|
+run_symlink_test(common-src_in_bin "binary/source" "binary" "source" "..")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../different_src/source_real
|
|
|
+# .../different_bin/binary_real
|
|
|
+# .../different/source -> ../different_src/source_real
|
|
|
+# .../different/binary -> ../different_bin/binary_real
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_src")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_bin")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_src/source_real")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_bin/binary_real")
|
|
|
+file(CREATE_LINK "../different_src/source_real" "${RunCMake_BINARY_DIR}/different/source" SYMBOLIC)
|
|
|
+file(CREATE_LINK "../different_bin/binary_real" "${RunCMake_BINARY_DIR}/different/binary" SYMBOLIC)
|
|
|
+run_symlink_test(different-separate "source" "binary" "../../different/source" "../../different/binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../different_src/source_real
|
|
|
+# .../different_bin/binary_real
|
|
|
+# .../different/source -> ../different_src/source_real
|
|
|
+# .../different_src/source_real/binary -> ../../different_bin/binary_real
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_src")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_bin")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_src/source_real")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_bin/binary_real")
|
|
|
+file(CREATE_LINK "../different_src/source_real" "${RunCMake_BINARY_DIR}/different/source" SYMBOLIC)
|
|
|
+file(CREATE_LINK "../../different_bin/binary_real" "${RunCMake_BINARY_DIR}/different_src/source_real/binary" SYMBOLIC)
|
|
|
+run_symlink_test(different-bin_in_src "source" "source/binary" "../../different/source" "binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../different_src/source_real
|
|
|
+# .../different_bin/binary_real
|
|
|
+# .../different/binary -> ../different_bin/binary_real
|
|
|
+# .../different_bin/binary_real/source -> ../../different_src/source_real
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_src")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_bin")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_src/source_real")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_bin/binary_real")
|
|
|
+file(CREATE_LINK "../different_bin/binary_real" "${RunCMake_BINARY_DIR}/different/binary" SYMBOLIC)
|
|
|
+file(CREATE_LINK "../../different_src/source_real" "${RunCMake_BINARY_DIR}/different_bin/binary_real/source" SYMBOLIC)
|
|
|
+run_symlink_test(different-src_in_bin "binary/source" "binary" "source" "../../different/binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../asymmetric_real/path/binary
|
|
|
+# .../asymmetric/source
|
|
|
+# .../asymmetric/binary -> ../asymmetric_real/path/binary
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric_real")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric/source")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric_real/path/binary")
|
|
|
+file(CREATE_LINK "../asymmetric_real/path/binary" "${RunCMake_BINARY_DIR}/asymmetric/binary" SYMBOLIC)
|
|
|
+run_symlink_test(asymmetric-separate "source" "binary" "../../../asymmetric/source" "../binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../asymmetric_real/path/binary
|
|
|
+# .../asymmetric/source
|
|
|
+# .../asymmetric/source/binary -> ../../asymmetric_real/path/binary
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric_real")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric/source")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric_real/path/binary")
|
|
|
+file(CREATE_LINK "../../asymmetric_real/path/binary" "${RunCMake_BINARY_DIR}/asymmetric/source/binary" SYMBOLIC)
|
|
|
+run_symlink_test(asymmetric-bin_in_src "source" "source/binary" "../../../asymmetric/source" "binary")
|
|
|
+
|
|
|
+# Create the following structure:
|
|
|
+#
|
|
|
+# .../asymmetric_real/path/source
|
|
|
+# .../asymmetric/binary
|
|
|
+# .../asymmetric/binary/source -> ../../asymmetric_real/path/source
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric")
|
|
|
+file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric_real")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric/binary")
|
|
|
+file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric_real/path/source")
|
|
|
+file(CREATE_LINK "../../asymmetric_real/path/source" "${RunCMake_BINARY_DIR}/asymmetric/binary/source" SYMBOLIC)
|
|
|
+run_symlink_test(asymmetric-src_in_bin "binary/source" "binary" "source" "../../../asymmetric/binary")
|