RunCMakeTest.cmake 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. include(RunCMake)
  2. function(run_symlink_test_case)
  3. file(REMOVE_RECURSE
  4. "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt"
  5. "${RunCMake_TEST_BINARY_DIR}/CMakeFiles"
  6. )
  7. run_cmake_with_options(${ARGN})
  8. endfunction()
  9. # This function assumes that ``${RunCMake_BINARY_DIR}/${name}/source`` and
  10. # ``${RunCMake_BINARY_DIR}/${name}/binary`` are set up properly prior to
  11. # calling it.
  12. function (run_symlink_test case src bin src_from_bin bin_from_src)
  13. string(REGEX REPLACE "-.*" "" name "${case}")
  14. set(RunCMake_TEST_NO_CLEAN TRUE)
  15. set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/${name}/${src}")
  16. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${name}/${bin}")
  17. configure_file(
  18. "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt"
  19. "${RunCMake_TEST_SOURCE_DIR}/CMakeLists.txt"
  20. COPYONLY)
  21. # We explicitly pass the source directory argument for each case.
  22. set(RunCMake_TEST_NO_SOURCE_DIR 1)
  23. # Test running in binary directory.
  24. set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  25. # Emulate a shell using this directory.
  26. set(ENV{PWD} "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}")
  27. # Pass absolute path to the source tree, plain.
  28. set(RunCMake_TEST_VARIANT_DESCRIPTION " $abs/${name}/${src}")
  29. run_symlink_test_case("${case}" "${RunCMake_TEST_SOURCE_DIR}")
  30. # Pass absolute path to the source tree, with -S.
  31. set(RunCMake_TEST_VARIANT_DESCRIPTION " -S $abs/${name}/${src}")
  32. run_symlink_test_case("${case}" -S "${RunCMake_TEST_SOURCE_DIR}")
  33. # Pass relative path to the source tree, plain.
  34. set(RunCMake_TEST_VARIANT_DESCRIPTION " ${src_from_bin}")
  35. run_symlink_test_case("${case}" "${src_from_bin}")
  36. # Pass relative path to the source tree, with -S.
  37. set(RunCMake_TEST_VARIANT_DESCRIPTION " -S ${src_from_bin}")
  38. run_symlink_test_case("${case}" -S "${src_from_bin}")
  39. # Test running in source directory.
  40. set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}")
  41. # Emulate a shell using this directory.
  42. set(ENV{PWD} "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}")
  43. # Pass absolute path to the binary tree with -B.
  44. set(RunCMake_TEST_VARIANT_DESCRIPTION " -B $abs/${name}/${bin}")
  45. run_symlink_test_case("${case}" -B "${RunCMake_TEST_BINARY_DIR}")
  46. # Pass relative path to the binary tree with -B.
  47. set(RunCMake_TEST_VARIANT_DESCRIPTION " -B ${bin_from_src}")
  48. run_symlink_test_case("${case}" -B "${bin_from_src}")
  49. # Test running in another directory.
  50. set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_BINARY_DIR}/${name}")
  51. # Emulate a shell using this directory.
  52. set(ENV{PWD} "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}")
  53. # Pass absolute paths to the source and binary trees.
  54. set(RunCMake_TEST_VARIANT_DESCRIPTION " -S $abs/${name}/${src} -B $abs/${name}/${bin}")
  55. run_symlink_test_case("${case}" -S "${RunCMake_TEST_SOURCE_DIR}" -B "${RunCMake_TEST_BINARY_DIR}")
  56. # Pass relative paths to the source and binary trees.
  57. set(RunCMake_TEST_VARIANT_DESCRIPTION " -S ${src} -B ${bin}")
  58. run_symlink_test_case("${case}" -S "${src}" -B "${bin}")
  59. # Pass relative paths to the source and binary trees.
  60. set(RunCMake_TEST_VARIANT_DESCRIPTION " -S ../${name}/${src} -B ../${name}/${bin}")
  61. run_symlink_test_case("${case}" -S "../${name}/${src}" -B "../${name}/${bin}")
  62. # Verify paths passed to compiler.
  63. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  64. run_symlink_test_case("${case}-exe" -S "${src}" -B "${bin}")
  65. if (RunCMake_GENERATOR MATCHES "Xcode")
  66. # The native build system may pass the real paths.
  67. set(RunCMake-stdout-file "generic-exe-build-stdout.txt")
  68. endif()
  69. set(RunCMake_TEST_OUTPUT_MERGE 1)
  70. run_cmake_command("${case}-exe-build" ${CMAKE_COMMAND} --build "${bin}")
  71. endfunction ()
  72. # Create the following structure:
  73. #
  74. # .../none/source
  75. # .../none/binary
  76. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/none")
  77. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/source")
  78. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/binary")
  79. run_symlink_test(none-separate "source" "binary" "../source" "../binary")
  80. # Create the following structure:
  81. #
  82. # .../none/source
  83. # .../none/source/binary
  84. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/none")
  85. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/source")
  86. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/source/binary")
  87. run_symlink_test(none-bin_in_src "source" "source/binary" ".." "binary")
  88. # Create the following structure:
  89. #
  90. # .../none/binary
  91. # .../none/binary/source
  92. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/none")
  93. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/binary")
  94. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/none/binary/source")
  95. run_symlink_test(none-src_in_bin "binary/source" "binary" "source" "..")
  96. # Create the following structure:
  97. #
  98. # .../common_real/source
  99. # .../common_real/binary
  100. # .../common -> common_real
  101. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/common_real")
  102. file(REMOVE "${RunCMake_BINARY_DIR}/common")
  103. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/source")
  104. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/binary")
  105. file(CREATE_LINK "common_real" "${RunCMake_BINARY_DIR}/common" SYMBOLIC)
  106. run_symlink_test(common-separate "source" "binary" "../source" "../binary")
  107. # Create the following structure:
  108. #
  109. # .../common_real/source
  110. # .../common_real/source/binary
  111. # .../common -> common_real
  112. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/common_real")
  113. file(REMOVE "${RunCMake_BINARY_DIR}/common")
  114. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/source")
  115. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/source/binary")
  116. file(CREATE_LINK "common_real" "${RunCMake_BINARY_DIR}/common" SYMBOLIC)
  117. run_symlink_test(common-bin_in_src "source" "source/binary" ".." "binary")
  118. # Create the following structure:
  119. #
  120. # .../common_real/binary
  121. # .../common_real/binary/source
  122. # .../common -> common_real
  123. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/common_real")
  124. file(REMOVE "${RunCMake_BINARY_DIR}/common")
  125. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/binary")
  126. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/common_real/binary/source")
  127. file(CREATE_LINK "common_real" "${RunCMake_BINARY_DIR}/common" SYMBOLIC)
  128. run_symlink_test(common-src_in_bin "binary/source" "binary" "source" "..")
  129. # Create the following structure:
  130. #
  131. # .../different_src/source_real
  132. # .../different_bin/binary_real
  133. # .../different/source -> ../different_src/source_real
  134. # .../different/binary -> ../different_bin/binary_real
  135. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different")
  136. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_src")
  137. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_bin")
  138. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different")
  139. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_src/source_real")
  140. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_bin/binary_real")
  141. file(CREATE_LINK "../different_src/source_real" "${RunCMake_BINARY_DIR}/different/source" SYMBOLIC)
  142. file(CREATE_LINK "../different_bin/binary_real" "${RunCMake_BINARY_DIR}/different/binary" SYMBOLIC)
  143. run_symlink_test(different-separate "source" "binary" "../../different/source" "../../different/binary")
  144. # Create the following structure:
  145. #
  146. # .../different_src/source_real
  147. # .../different_bin/binary_real
  148. # .../different/source -> ../different_src/source_real
  149. # .../different_src/source_real/binary -> ../../different_bin/binary_real
  150. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different")
  151. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_src")
  152. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_bin")
  153. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different")
  154. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_src/source_real")
  155. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_bin/binary_real")
  156. file(CREATE_LINK "../different_src/source_real" "${RunCMake_BINARY_DIR}/different/source" SYMBOLIC)
  157. file(CREATE_LINK "../../different_bin/binary_real" "${RunCMake_BINARY_DIR}/different_src/source_real/binary" SYMBOLIC)
  158. run_symlink_test(different-bin_in_src "source" "source/binary" "../../different/source" "binary")
  159. # Create the following structure:
  160. #
  161. # .../different_src/source_real
  162. # .../different_bin/binary_real
  163. # .../different/binary -> ../different_bin/binary_real
  164. # .../different_bin/binary_real/source -> ../../different_src/source_real
  165. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different")
  166. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_src")
  167. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/different_bin")
  168. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different")
  169. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_src/source_real")
  170. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/different_bin/binary_real")
  171. file(CREATE_LINK "../different_bin/binary_real" "${RunCMake_BINARY_DIR}/different/binary" SYMBOLIC)
  172. file(CREATE_LINK "../../different_src/source_real" "${RunCMake_BINARY_DIR}/different_bin/binary_real/source" SYMBOLIC)
  173. run_symlink_test(different-src_in_bin "binary/source" "binary" "source" "../../different/binary")
  174. # Create the following structure:
  175. #
  176. # .../asymmetric_real/path/binary
  177. # .../asymmetric/source
  178. # .../asymmetric/binary -> ../asymmetric_real/path/binary
  179. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric")
  180. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric_real")
  181. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric/source")
  182. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric_real/path/binary")
  183. file(CREATE_LINK "../asymmetric_real/path/binary" "${RunCMake_BINARY_DIR}/asymmetric/binary" SYMBOLIC)
  184. run_symlink_test(asymmetric-separate "source" "binary" "../../../asymmetric/source" "../binary")
  185. # Create the following structure:
  186. #
  187. # .../asymmetric_real/path/binary
  188. # .../asymmetric/source
  189. # .../asymmetric/source/binary -> ../../asymmetric_real/path/binary
  190. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric")
  191. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric_real")
  192. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric/source")
  193. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric_real/path/binary")
  194. file(CREATE_LINK "../../asymmetric_real/path/binary" "${RunCMake_BINARY_DIR}/asymmetric/source/binary" SYMBOLIC)
  195. run_symlink_test(asymmetric-bin_in_src "source" "source/binary" "../../../asymmetric/source" "binary")
  196. # Create the following structure:
  197. #
  198. # .../asymmetric_real/path/source
  199. # .../asymmetric/binary
  200. # .../asymmetric/binary/source -> ../../asymmetric_real/path/source
  201. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric")
  202. file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/asymmetric_real")
  203. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric/binary")
  204. file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/asymmetric_real/path/source")
  205. file(CREATE_LINK "../../asymmetric_real/path/source" "${RunCMake_BINARY_DIR}/asymmetric/binary/source" SYMBOLIC)
  206. run_symlink_test(asymmetric-src_in_bin "binary/source" "binary" "source" "../../../asymmetric/binary")