CMakeLists.txt 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. #
  2. # Wrapping
  3. #
  4. PROJECT (CustomCommand)
  5. ADD_SUBDIRECTORY(GeneratedHeader)
  6. #
  7. # Lib and exe path
  8. #
  9. SET (LIBRARY_OUTPUT_PATH
  10. ${PROJECT_BINARY_DIR}/bin/ CACHE INTERNAL
  11. "Single output directory for building all libraries.")
  12. SET (EXECUTABLE_OUTPUT_PATH
  13. ${PROJECT_BINARY_DIR}/bin/ CACHE INTERNAL
  14. "Single output directory for building all executables.")
  15. ################################################################
  16. #
  17. # First test using a compiled generator to create a .c file
  18. #
  19. ################################################################
  20. # add the executable that will generate the file
  21. ADD_EXECUTABLE(generator generator.cxx)
  22. GET_TARGET_PROPERTY(generator_PATH generator LOCATION)
  23. MESSAGE("Location ${generator_PATH}")
  24. # the folowing assumes that a cmSourceFile
  25. # is instantiated for the output, with GENERATED 1
  26. # at the end of the day this becomes a what in VS ?
  27. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/generated.c
  28. DEPENDS generator
  29. COMMAND ${generator_PATH}
  30. ARGS ${PROJECT_BINARY_DIR}/generated.c
  31. )
  32. ################################################################
  33. #
  34. # Test using a wrapper to wrap a header file
  35. #
  36. ################################################################
  37. # add the executable that will generate the file
  38. ADD_EXECUTABLE(wrapper wrapper.cxx)
  39. # the following assumes that a cmSourceFile
  40. # is instantiated for the output, with GENERATED 1
  41. # at the end of the day this becomes a what in VS ?
  42. ADD_CUSTOM_COMMAND(
  43. OUTPUT ${PROJECT_BINARY_DIR}/wrapped.c ${PROJECT_BINARY_DIR}/wrapped_help.c
  44. DEPENDS wrapper
  45. MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/wrapped.h
  46. COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/wrapper
  47. ${PROJECT_BINARY_DIR}/wrapped.c ${PROJECT_BINARY_DIR}/wrapped_help.c
  48. )
  49. ################################################################
  50. #
  51. # Test creating files from a custom target
  52. #
  53. ################################################################
  54. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.dvi
  55. DEPENDS ${PROJECT_SOURCE_DIR}/doc1.tex
  56. COMMAND ${CMAKE_COMMAND}
  57. ARGS -E copy ${PROJECT_SOURCE_DIR}/doc1.tex
  58. ${PROJECT_BINARY_DIR}/doc1.dvi
  59. )
  60. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.h
  61. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1.dvi to doc1temp.h."
  62. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1.dvi
  63. ${PROJECT_BINARY_DIR}/doc1temp.h
  64. )
  65. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.h APPEND
  66. DEPENDS ${PROJECT_BINARY_DIR}/doc1.dvi
  67. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1temp.h to doc1.h."
  68. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1temp.h
  69. ${PROJECT_BINARY_DIR}/doc1.h
  70. COMMAND ${CMAKE_COMMAND} -E echo " Removing doc1temp.h."
  71. COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/doc1temp.h
  72. )
  73. # Add custom command to generate foo.h.
  74. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.h
  75. DEPENDS ${PROJECT_SOURCE_DIR}/foo.h.in
  76. COMMAND ${CMAKE_COMMAND} -E echo " Copying foo.h.in to foo.h."
  77. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/foo.h.in
  78. ${PROJECT_BINARY_DIR}/foo.h
  79. )
  80. # Add the location of foo.h to the include path.
  81. INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
  82. # Add a custom target to drive generation of doc1.h.
  83. ADD_CUSTOM_TARGET(TDocument ALL
  84. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1.h to doc2.h."
  85. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1.h
  86. ${PROJECT_BINARY_DIR}/doc2.h
  87. DEPENDS ${PROJECT_BINARY_DIR}/doc1.h
  88. COMMENT "Running top-level TDocument commands"
  89. )
  90. # Setup a pre- and post-build pair that will fail if not run in the
  91. # proper order.
  92. ADD_CUSTOM_COMMAND(
  93. TARGET TDocument PRE_BUILD
  94. COMMAND ${CMAKE_COMMAND} -E echo " Writing doc1pre.txt."
  95. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/doc1.tex ${PROJECT_BINARY_DIR}/doc1pre.txt
  96. )
  97. ADD_CUSTOM_COMMAND(
  98. TARGET TDocument POST_BUILD
  99. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1pre.txt to doc2post.txt."
  100. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1pre.txt
  101. ${PROJECT_BINARY_DIR}/doc2post.txt
  102. )
  103. ################################################################
  104. #
  105. # Test using a multistep generated file
  106. #
  107. ################################################################
  108. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.pre
  109. DEPENDS ${PROJECT_SOURCE_DIR}/foo.in
  110. COMMAND ${CMAKE_COMMAND}
  111. ARGS -E copy ${PROJECT_SOURCE_DIR}/foo.in
  112. ${PROJECT_BINARY_DIR}/foo.pre
  113. )
  114. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.c
  115. DEPENDS ${PROJECT_BINARY_DIR}/foo.pre
  116. COMMAND ${CMAKE_COMMAND}
  117. ARGS -E copy ${PROJECT_BINARY_DIR}/foo.pre
  118. ${PROJECT_BINARY_DIR}/foo.c
  119. )
  120. # Add custom command to generate not_included.h, which is a header
  121. # file that is not included by any source in this project. This will
  122. # test whether all custom command outputs explicitly listed as sources
  123. # get generated even if they are not needed by an object file.
  124. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/not_included.h
  125. DEPENDS ${PROJECT_SOURCE_DIR}/foo.h.in
  126. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/foo.h.in
  127. ${PROJECT_BINARY_DIR}/not_included.h
  128. )
  129. # Tell the executable where to find not_included.h.
  130. CONFIGURE_FILE(
  131. ${PROJECT_SOURCE_DIR}/config.h.in
  132. ${PROJECT_BINARY_DIR}/config.h
  133. @ONLY IMMEDIATE
  134. )
  135. # add the executable
  136. ADD_EXECUTABLE(CustomCommand
  137. ${PROJECT_BINARY_DIR}/foo.h
  138. ${PROJECT_BINARY_DIR}/foo.c
  139. ${PROJECT_BINARY_DIR}/wrapped.c
  140. ${PROJECT_BINARY_DIR}/wrapped_help.c
  141. ${PROJECT_BINARY_DIR}/generated.c
  142. ${PROJECT_BINARY_DIR}/not_included.h
  143. )
  144. TARGET_LINK_LIBRARIES(CustomCommand GeneratedHeader)
  145. # must add a dependency on TDocument otherwise it might never build and
  146. # the CustomCommand executable really needs doc1.h
  147. ADD_DEPENDENCIES(CustomCommand TDocument)
  148. ##############################################################################
  149. # Test non-trivial command line arguments in custom commands.
  150. SET(EXPECTED_ARGUMENTS)
  151. SET(CHECK_ARGS
  152. c:/posix/path
  153. c:\\windows\\path
  154. 'single-quotes'
  155. single'quote
  156. \"double-quotes\"
  157. double\"quote
  158. "\\;semi-colons\\;"
  159. "semi\\;colon"
  160. `back-ticks`
  161. back`tick
  162. "(parens)"
  163. "(lparen"
  164. "rparen)"
  165. $dollar-signs$
  166. dollar$sign
  167. &ampersands&
  168. amper&sand
  169. @two-ats@
  170. one@at
  171. "c:/posix/path/with space"
  172. "c:\\windows\\path\\with space"
  173. "'single quotes with space'"
  174. "single'quote with space"
  175. "\"double-quotes with space\""
  176. "double\"quote with space"
  177. "\\;semi-colons with space\\;"
  178. "semi\\;colon with space"
  179. "`back-ticks` with space"
  180. "back`tick with space"
  181. "(parens) with space"
  182. "(lparen with space"
  183. "rparen) with space"
  184. "$dollar-signs$ with space"
  185. "dollar$sign with space"
  186. "&ampersands& with space"
  187. "amper&sand with space"
  188. "@two-ats@ with space"
  189. "one@at with space"
  190. )
  191. FOREACH(arg ${CHECK_ARGS})
  192. SET(ARG "${arg}")
  193. STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARG "${ARG}")
  194. STRING(REGEX REPLACE "\"" "\\\\\"" ARG "${ARG}")
  195. SET(EXPECTED_ARGUMENTS
  196. "${EXPECTED_ARGUMENTS} \"${ARG}\",
  197. ")
  198. ENDFOREACH(arg)
  199. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
  200. CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/check_command_line.c.in
  201. ${CMAKE_CURRENT_BINARY_DIR}/check_command_line.c
  202. @ONLY IMMEDIATE)
  203. ADD_EXECUTABLE(check_command_line
  204. ${CMAKE_CURRENT_BINARY_DIR}/check_command_line.c)
  205. ADD_CUSTOM_COMMAND(
  206. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/command_line_check
  207. COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/check_command_line
  208. ${CHECK_ARGS}
  209. VERBATIM
  210. COMMENT "Checking custom command line escapes"
  211. )
  212. SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/command_line_check
  213. PROPERTIES SYMBOLIC 1)
  214. ADD_CUSTOM_TARGET(do_check_command_line ALL
  215. DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/command_line_check
  216. COMMAND ${CMAKE_COMMAND} -E echo "Checking custom target command escapes"
  217. COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/check_command_line
  218. ${CHECK_ARGS}
  219. VERBATIM
  220. )
  221. ADD_DEPENDENCIES(do_check_command_line check_command_line)