CMakeLists.txt 7.8 KB

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