CustomCommandOutputGenex.cmake 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE)
  2. enable_language(C)
  3. add_executable(echo echo.c)
  4. add_custom_command(
  5. OUTPUT echo_raw_$<CONFIG>.txt
  6. COMMAND echo $<CONFIG> echo_raw_$<CONFIG>.txt
  7. WORKING_DIRECTORY $<CONFIG>
  8. )
  9. add_custom_command(
  10. OUTPUT echo_genex_$<IF:$<CONFIG:Debug>,Debug,$<IF:$<CONFIG:Release>,Release,$<IF:$<CONFIG:MinSizeRel>,MinSizeRel,RelWithDebInfo>>>.txt
  11. COMMAND $<TARGET_FILE:echo> $<COMMAND_CONFIG:$<CONFIG>> echo_genex_$<OUTPUT_CONFIG:$<CONFIG>>.txt
  12. WORKING_DIRECTORY $<OUTPUT_CONFIG:$<CONFIG>>
  13. )
  14. add_custom_command(
  15. OUTPUT echo_genex_out_$<CONFIG>.txt
  16. COMMAND $<OUTPUT_CONFIG:$<TARGET_FILE:echo>> $<CONFIG> echo_genex_out_$<CONFIG>.txt
  17. WORKING_DIRECTORY $<COMMAND_CONFIG:$<CONFIG>>
  18. )
  19. add_custom_command(
  20. OUTPUT depend_$<CONFIG>.txt
  21. COMMAND ${CMAKE_COMMAND} -E echo depend_$<CONFIG>.txt
  22. )
  23. add_custom_command(
  24. OUTPUT echo_depend_$<CONFIG>.txt
  25. COMMAND ${CMAKE_COMMAND} -E echo echo_depend_$<CONFIG>.txt
  26. DEPENDS depend_$<CONFIG>.txt
  27. )
  28. add_custom_command(
  29. OUTPUT echo_depend_out_$<CONFIG>.txt
  30. COMMAND ${CMAKE_COMMAND} -E echo echo_depend_out_$<CONFIG>.txt
  31. DEPENDS $<OUTPUT_CONFIG:depend_$<CONFIG>.txt>
  32. )
  33. add_custom_command(
  34. OUTPUT echo_depend_cmd_$<CONFIG>.txt
  35. COMMAND ${CMAKE_COMMAND} -E echo echo_depend_cmd_$<CONFIG>.txt
  36. DEPENDS $<COMMAND_CONFIG:depend_$<CONFIG>.txt>
  37. )
  38. add_custom_command(
  39. OUTPUT depend_echo_raw_$<CONFIG>.txt
  40. COMMAND ${CMAKE_COMMAND} -E echo depend_echo_raw_$<CONFIG>.txt
  41. DEPENDS echo
  42. )
  43. add_custom_command(
  44. OUTPUT depend_echo_genex_$<CONFIG>.txt
  45. COMMAND ${CMAKE_COMMAND} -E echo depend_echo_genex_$<CONFIG>.txt
  46. DEPENDS $<TARGET_FILE:echo>
  47. )
  48. add_custom_command(
  49. OUTPUT depend_echo_genex_out_$<CONFIG>.txt
  50. COMMAND ${CMAKE_COMMAND} -E echo depend_echo_genex_out_$<CONFIG>.txt
  51. DEPENDS $<OUTPUT_CONFIG:$<TARGET_FILE:echo>>
  52. )
  53. add_custom_command(
  54. OUTPUT depend_echo_genex_cmd_$<CONFIG>.txt
  55. COMMAND ${CMAKE_COMMAND} -E echo depend_echo_genex_cmd_$<CONFIG>.txt
  56. DEPENDS $<COMMAND_CONFIG:$<TARGET_FILE:echo>>
  57. )
  58. # An OUTPUT that is not per-config prevents cross-config generation.
  59. add_custom_command(
  60. OUTPUT echo_no_cross_output.txt echo_no_cross_output_$<CONFIG>.txt
  61. COMMAND echo $<CONFIG> echo_no_cross_output_$<CONFIG>.txt
  62. WORKING_DIRECTORY $<CONFIG>
  63. )
  64. add_custom_command(
  65. OUTPUT echo_no_cross_output_$<IF:$<CONFIG:Debug>,a,b>.txt echo_no_cross_output_if_$<CONFIG>.txt
  66. COMMAND echo $<CONFIG> echo_no_cross_output_if_$<CONFIG>.txt
  67. WORKING_DIRECTORY $<CONFIG>
  68. )
  69. # BYPRODUCTS that are not per-config prevent cross-config generation.
  70. add_custom_command(
  71. OUTPUT echo_no_cross_byproduct_$<CONFIG>.txt
  72. BYPRODUCTS echo_no_cross_byproduct.txt
  73. COMMAND echo $<CONFIG> echo_no_cross_byproduct_$<CONFIG>.txt
  74. WORKING_DIRECTORY $<CONFIG>
  75. )
  76. add_custom_command(
  77. OUTPUT echo_no_cross_byproduct_if_$<CONFIG>.txt
  78. BYPRODUCTS echo_no_cross_byproduct_$<IF:$<CONFIG:Debug>,a,b>.txt
  79. COMMAND echo $<CONFIG> echo_no_cross_byproduct_if_$<CONFIG>.txt
  80. WORKING_DIRECTORY $<CONFIG>
  81. )
  82. foreach(case
  83. echo_raw
  84. echo_genex
  85. echo_genex_out
  86. echo_depend
  87. echo_depend_out
  88. echo_depend_cmd
  89. depend
  90. depend_echo_raw
  91. depend_echo_genex
  92. depend_echo_genex_out
  93. depend_echo_genex_cmd
  94. echo_no_cross_output
  95. echo_no_cross_output_if
  96. echo_no_cross_byproduct
  97. echo_no_cross_byproduct_if
  98. )
  99. set_property(SOURCE
  100. ${CMAKE_CURRENT_BINARY_DIR}/${case}_Debug.txt
  101. ${CMAKE_CURRENT_BINARY_DIR}/${case}_Release.txt
  102. ${CMAKE_CURRENT_BINARY_DIR}/${case}_MinSizeRel.txt
  103. ${CMAKE_CURRENT_BINARY_DIR}/${case}_RelWithDebInfo.txt
  104. PROPERTY SYMBOLIC 1)
  105. add_custom_target(${case} DEPENDS ${case}_$<CONFIG>.txt)
  106. endforeach()
  107. # An OUTPUT in only one configuration.
  108. add_custom_command(
  109. OUTPUT "$<$<CONFIG:Debug>:echo_dbg_Debug.txt>"
  110. COMMAND echo $<CONFIG> "$<$<CONFIG:Debug>:echo_dbg_Debug.txt>"
  111. )
  112. set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/echo_dbg_Debug.txt PROPERTY SYMBOLIC 1)
  113. add_custom_target(echo_dbg DEPENDS "$<$<CONFIG:Debug>:echo_dbg_Debug.txt>")
  114. # An OUTPUT in only one configuration with BYPRODUCTS in every configuration.
  115. add_custom_command(
  116. OUTPUT "$<$<CONFIG:Debug>:echo_dbgx_Debug.txt>"
  117. BYPRODUCTS echo_dbgx_byproduct_$<CONFIG>.txt
  118. COMMAND echo $<CONFIG> "$<$<CONFIG:Debug>:echo_dbgx_Debug.txt>" echo_dbgx_byproduct_$<CONFIG>.txt
  119. COMMAND_EXPAND_LISTS
  120. )
  121. set_property(SOURCE
  122. ${CMAKE_CURRENT_BINARY_DIR}/echo_dbgx_Debug.txt
  123. ${CMAKE_CURRENT_BINARY_DIR}/echo_dbgx_byproduct_Debug.txt
  124. ${CMAKE_CURRENT_BINARY_DIR}/echo_dbgx_byproduct_Release.txt
  125. ${CMAKE_CURRENT_BINARY_DIR}/echo_dbgx_byproduct_MinSizeRel.txt
  126. ${CMAKE_CURRENT_BINARY_DIR}/echo_dbgx_byproduct_RelWithDebInfo.txt
  127. PROPERTY SYMBOLIC 1)
  128. add_custom_target(echo_dbgx DEPENDS "$<$<CONFIG:Debug>:echo_dbgx_Debug.txt>")
  129. # A non-cross-config custom command expresses target dependencies in command config.
  130. add_custom_command(
  131. OUTPUT echo_depend_target.txt
  132. COMMAND ${CMAKE_COMMAND} -E env $<TARGET_FILE:echo> $<CONFIG>
  133. # A real project should do:
  134. # DEPENDS $<TARGET_FILE:echo>
  135. # but here we are testing the target-level dependency implied by TARGET_FILE.
  136. )
  137. add_custom_target(echo_depend_target DEPENDS echo_depend_target.txt)
  138. add_custom_target(echo_target_raw
  139. BYPRODUCTS echo_target_raw_$<CONFIG>.txt
  140. COMMENT echo_target_raw
  141. COMMAND echo $<CONFIG> echo_target_raw_$<CONFIG>.txt
  142. WORKING_DIRECTORY $<CONFIG>
  143. )
  144. add_custom_target(echo_target_genex
  145. BYPRODUCTS echo_target_genex_$<CONFIG>.txt
  146. COMMENT echo_target_genex
  147. COMMAND $<TARGET_FILE:echo> $<COMMAND_CONFIG:$<CONFIG>> echo_target_genex_$<OUTPUT_CONFIG:$<CONFIG>>.txt
  148. WORKING_DIRECTORY $<OUTPUT_CONFIG:$<CONFIG>>
  149. )
  150. add_custom_target(echo_target_genex_out
  151. BYPRODUCTS echo_target_genex_out_$<CONFIG>.txt
  152. COMMENT echo_target_genex_out
  153. COMMAND $<OUTPUT_CONFIG:$<TARGET_FILE:echo>> $<CONFIG> echo_target_genex_out_$<CONFIG>.txt
  154. WORKING_DIRECTORY $<COMMAND_CONFIG:$<CONFIG>>
  155. )
  156. add_custom_target(echo_target_depend
  157. COMMAND ${CMAKE_COMMAND} -E echo echo_target_depend_$<CONFIG>.txt
  158. DEPENDS depend_$<CONFIG>.txt
  159. COMMENT echo_target_depend
  160. )
  161. add_custom_target(echo_target_depend_out
  162. COMMAND ${CMAKE_COMMAND} -E echo echo_target_depend_out_$<CONFIG>.txt
  163. DEPENDS $<OUTPUT_CONFIG:depend_$<CONFIG>.txt>
  164. COMMENT echo_target_depend_out
  165. )
  166. add_custom_target(echo_target_depend_cmd
  167. COMMAND ${CMAKE_COMMAND} -E echo echo_target_depend_cmd_$<CONFIG>.txt
  168. DEPENDS $<COMMAND_CONFIG:depend_$<CONFIG>.txt>
  169. COMMENT echo_target_depend_cmd
  170. )
  171. # BYPRODUCTS that are not per-config block cross-configs.
  172. add_custom_target(target_no_cross_byproduct
  173. BYPRODUCTS target_no_cross_byproduct.txt
  174. COMMENT target_no_cross_byproduct
  175. COMMAND echo $<CONFIG> target_no_cross_byproduct.txt
  176. WORKING_DIRECTORY $<CONFIG>
  177. )
  178. add_custom_target(target_post_build
  179. COMMENT target_post_build
  180. COMMAND ${CMAKE_COMMAND} -E echo "target main build"
  181. )
  182. add_custom_command(TARGET target_post_build POST_BUILD
  183. COMMAND ${CMAKE_COMMAND} -E echo "target post build"
  184. )