CMakeLists.txt 8.1 KB

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