CMakeLists.txt 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. cmake_minimum_required(VERSION 2.6)
  2. project(testRebuild)
  3. if(APPLE)
  4. set(CMake_TEST_XCODE_VERSION 0)
  5. if(XCODE_VERSION)
  6. set(CMake_TEST_XCODE_VERSION "${XCODE_VERSION}")
  7. else()
  8. execute_process(
  9. COMMAND xcodebuild -version
  10. OUTPUT_VARIABLE _version ERROR_VARIABLE _version_err
  11. )
  12. if(_version MATCHES "^Xcode ([0-9]+(\\.[0-9]+)*)")
  13. set(CMake_TEST_XCODE_VERSION "${CMAKE_MATCH_1}")
  14. endif()
  15. endif()
  16. # only use multi-arch if the sysroot exists on this machine
  17. # Ninja needs -M which could not be used with multiple -arch flags
  18. if(EXISTS "${CMAKE_OSX_SYSROOT}" AND NOT "${CMAKE_GENERATOR}" MATCHES "Ninja")
  19. if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 12)
  20. set(CMAKE_OSX_ARCHITECTURES arm64 x86_64)
  21. elseif(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 10)
  22. # Arch 'i386' no longer works in Xcode 10.
  23. set(CMAKE_OSX_ARCHITECTURES x86_64)
  24. elseif(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 4)
  25. # Arch 'ppc' no longer works in Xcode 4.
  26. set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
  27. else()
  28. set(CMAKE_OSX_ARCHITECTURES ppc i386)
  29. endif()
  30. endif()
  31. endif()
  32. add_library(foo STATIC ${testRebuild_BINARY_DIR}/foo.cxx)
  33. set_target_properties(foo PROPERTIES OUTPUT_NAME "foolib")
  34. # Add a generated header that regenerates when the generator is
  35. # rebuilt.
  36. add_custom_command(
  37. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/regen.h
  38. COMMAND generator ${CMAKE_CURRENT_BINARY_DIR}/regen.h regen
  39. DEPENDS generator # adds file-level dependency to re-run rule
  40. )
  41. # Add a generated header that does NOT regenerate when the generator
  42. # is rebuilt.
  43. add_custom_command(
  44. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/noregen.h
  45. COMMAND generator ${CMAKE_CURRENT_BINARY_DIR}/noregen.h noregen
  46. )
  47. # Test that the generator rebuilds when the static library source file
  48. # changes. This should cause regen.h to be recreated also.
  49. add_executable(generator generator.cxx)
  50. target_link_libraries(generator foo)
  51. set_target_properties(generator PROPERTIES OUTPUT_NAME "gen")
  52. # Build an executable to drive the build and rebuild.
  53. include_directories(${CMAKE_CURRENT_BINARY_DIR})
  54. add_executable(bar bar.cxx
  55. ${CMAKE_CURRENT_BINARY_DIR}/regen.h
  56. ${CMAKE_CURRENT_BINARY_DIR}/noregen.h
  57. )
  58. if(CMAKE_XCODE_BUILD_SYSTEM VERSION_GREATER_EQUAL 12)
  59. target_compile_definitions(bar PRIVATE XCODE_NEW_BUILD_SYSTEM)
  60. endif()
  61. #-----------------------------------------------------------------------------
  62. if("${CMAKE_GENERATOR}" MATCHES "Make")
  63. # Test the IMPLICIT_DEPENDS feature.
  64. set(ZOT_DEPENDS IMPLICIT_DEPENDS CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep.cxx)
  65. set(ZOT_CUSTOM_DEP
  66. IMPLICIT_DEPENDS CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep_custom.cxx
  67. CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep_custom2.cxx )
  68. else()
  69. # No IMPLICIT_DEPENDS...just depend directly.
  70. set(ZOT_DEPENDS DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx.in)
  71. set(ZOT_CUSTOM_DEP DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx.in)
  72. endif()
  73. add_custom_command(
  74. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx
  75. COMMAND ${CMAKE_COMMAND} -E copy
  76. ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx.in
  77. ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx
  78. ${ZOT_DEPENDS}
  79. )
  80. add_custom_command(
  81. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx
  82. COMMAND ${CMAKE_COMMAND} -E copy
  83. ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx.in
  84. ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx
  85. ${ZOT_CUSTOM_DEP}
  86. )
  87. add_custom_target(zot_custom ALL DEPENDS
  88. ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx)
  89. add_executable(zot zot.cxx ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx
  90. zot_macro_dir.cxx zot_macro_tgt.cxx)
  91. add_dependencies(zot zot_custom)
  92. add_library(zot_pch zot_pch.cxx)
  93. target_link_libraries(zot zot_pch)
  94. if(NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]")
  95. target_precompile_headers(zot_pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/zot_pch.hxx)
  96. endif()
  97. if (CMAKE_CXX_DEPENDS_USE_COMPILER AND
  98. CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.4")
  99. # Mixing pre-compile headers and flags to generate dependencies (-M options family)
  100. # causes the compiler to crash
  101. set_property(TARGET zot_pch PROPERTY DISABLE_PRECOMPILE_HEADERS ON)
  102. endif()
  103. # Test the #include line macro transformation rule support.
  104. set_property(
  105. TARGET zot
  106. PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM "ZOT_TGT(%)=<zot_%_tgt.hxx>"
  107. )
  108. set_property(
  109. DIRECTORY
  110. PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM "ZOT_DIR(%)=<zot_%_dir.hxx>"
  111. )
  112. if(TEST_LINK_DEPENDS)
  113. add_executable(linkdep linkdep.cxx)
  114. set_property(TARGET linkdep PROPERTY LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)
  115. add_library(foo_interface INTERFACE)
  116. set_property(TARGET foo_interface PROPERTY INTERFACE_LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)
  117. add_executable(linkdep2 linkdep.cxx)
  118. target_link_libraries(linkdep2 PRIVATE foo_interface)
  119. add_executable(linkdep3 linkdep.cxx)
  120. set_property(TARGET linkdep3 PROPERTY LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)
  121. add_library(foo_interface2 INTERFACE)
  122. set_property(TARGET foo_interface2 PROPERTY INTERFACE_LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)
  123. add_executable(linkdep4 linkdep.cxx)
  124. target_link_libraries(linkdep4 PRIVATE foo_interface2)
  125. endif()
  126. add_library(link_depends_no_shared_lib SHARED link_depends_no_shared_lib.c
  127. ${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_lib.h)
  128. add_executable(link_depends_no_shared_exe link_depends_no_shared_exe.c
  129. ${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_exe.h)
  130. target_link_libraries(link_depends_no_shared_exe link_depends_no_shared_lib)
  131. set_property(TARGET link_depends_no_shared_exe PROPERTY LINK_DEPENDS_NO_SHARED 1)
  132. add_custom_target(link_depends_no_shared_check ALL
  133. COMMAND ${CMAKE_COMMAND}
  134. -Dlib=$<TARGET_FILE:link_depends_no_shared_lib>
  135. -Dexe=$<TARGET_FILE:link_depends_no_shared_exe>
  136. -Dout=${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_check.txt
  137. -P ${CMAKE_CURRENT_SOURCE_DIR}/link_depends_no_shared_check.cmake
  138. )
  139. add_dependencies(link_depends_no_shared_check link_depends_no_shared_exe)
  140. add_custom_command(
  141. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dir/header.h
  142. DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dir/header.txt
  143. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  144. ${CMAKE_CURRENT_BINARY_DIR}/dir/header.txt
  145. ${CMAKE_CURRENT_BINARY_DIR}/dir/header.h
  146. )
  147. set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/dir/header.h
  148. PROPERTIES GENERATED 1)
  149. add_custom_target(header_tgt DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dir/header.h)
  150. include_directories(${CMAKE_CURRENT_BINARY_DIR})
  151. add_executable(ninjadep ninjadep.cpp)
  152. add_dependencies(ninjadep header_tgt)
  153. include(ExternalProject)
  154. ExternalProject_Add(ExternalBuild
  155. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/External
  156. BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/External
  157. STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/External/Stamp
  158. BUILD_ALWAYS 1
  159. CMAKE_ARGS
  160. -Dexternal_in=${CMAKE_CURRENT_BINARY_DIR}/external.in
  161. -Dexternal_out=${CMAKE_CURRENT_BINARY_DIR}/external.out
  162. INSTALL_COMMAND ""
  163. )
  164. add_custom_command(
  165. OUTPUT multi1-out1.txt multi1-out2.txt
  166. COMMAND ${CMAKE_COMMAND} -E copy multi1-in.txt multi1-out1.txt
  167. COMMAND ${CMAKE_COMMAND} -E copy multi1-in.txt multi1-out2.txt
  168. DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/multi1-in.txt
  169. )
  170. add_custom_command(
  171. OUTPUT multi1-out2-copy.txt
  172. COMMAND ${CMAKE_COMMAND} -E copy multi1-out2.txt multi1-out2-copy.txt
  173. DEPENDS multi1-out2.txt
  174. )
  175. add_custom_target(multi1 ALL DEPENDS multi1-out2-copy.txt)
  176. # Test having the first output never created.
  177. add_custom_command(
  178. OUTPUT multi2-dummy.txt multi2-real.txt
  179. COMMAND ${CMAKE_COMMAND} -E touch multi2-real.txt
  180. )
  181. set_property(SOURCE multi2-real.txt multi2-dummy.txt PROPERTY SYMBOLIC 1)
  182. add_custom_target(multi2 ALL DEPENDS multi2-real.txt)
  183. if(TEST_MULTI3)
  184. # Test having the second output never created. Does not work with msbuild.
  185. add_custom_command(
  186. OUTPUT multi3-real.txt multi3-dummy.txt
  187. COMMAND ${CMAKE_COMMAND} -E touch multi3-real.txt
  188. )
  189. set_property(SOURCE multi3-real.txt multi3-dummy.txt PROPERTY SYMBOLIC 1)
  190. add_custom_target(multi3 ALL DEPENDS multi3-real.txt)
  191. endif()
  192. add_executable(object_depends object_depends.cxx)
  193. set_property(SOURCE object_depends.cxx PROPERTY OBJECT_DEPENDS
  194. ${CMAKE_CURRENT_BINARY_DIR}/object_depends.txt)
  195. add_custom_target(object_depends_check ALL
  196. COMMAND ${CMAKE_COMMAND}
  197. -Dexe=$<TARGET_FILE:object_depends>
  198. -Dout=${CMAKE_CURRENT_BINARY_DIR}/object_depends_check.txt
  199. -Dtxt=${CMAKE_CURRENT_BINARY_DIR}/object_depends.txt
  200. -P ${CMAKE_CURRENT_SOURCE_DIR}/object_depends_check.cmake
  201. )
  202. add_dependencies(object_depends_check object_depends)