CMakeLists.txt 7.0 KB

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