CustomCommandOutputGenex.cmake 6.8 KB

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