CMakeLists.txt 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. DEPENDS ${PROJECT_BINARY_DIR}/doc1.dvi
  62. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1.dvi to doc1temp.h."
  63. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1.dvi
  64. ${PROJECT_BINARY_DIR}/doc1temp.h
  65. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1temp.h to doc1.h."
  66. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1temp.h
  67. ${PROJECT_BINARY_DIR}/doc1.h
  68. COMMAND ${CMAKE_COMMAND} -E echo " Removing doc1temp.h."
  69. COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/doc1temp.h
  70. )
  71. # Add custom command to generate foo.h.
  72. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.h
  73. DEPENDS ${PROJECT_SOURCE_DIR}/foo.h.in
  74. COMMAND ${CMAKE_COMMAND} -E echo " Copying foo.h.in to foo.h."
  75. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/foo.h.in
  76. ${PROJECT_BINARY_DIR}/foo.h
  77. )
  78. # Add the location of foo.h to the include path.
  79. INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
  80. # Add a custom target to drive generation of doc1.h.
  81. ADD_CUSTOM_TARGET(TDocument ALL
  82. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1.h to doc2.h."
  83. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1.h
  84. ${PROJECT_BINARY_DIR}/doc2.h
  85. DEPENDS ${PROJECT_BINARY_DIR}/doc1.h
  86. )
  87. # Setup a pre- and post-build pair that will fail if not run in the
  88. # proper order.
  89. ADD_CUSTOM_COMMAND(
  90. TARGET TDocument PRE_BUILD
  91. COMMAND ${CMAKE_COMMAND} -E echo " Writing doc1pre.txt."
  92. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/doc1.tex ${PROJECT_BINARY_DIR}/doc1pre.txt
  93. )
  94. ADD_CUSTOM_COMMAND(
  95. TARGET TDocument POST_BUILD
  96. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1pre.txt to doc2post.txt."
  97. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1pre.txt
  98. ${PROJECT_BINARY_DIR}/doc2post.txt
  99. )
  100. ################################################################
  101. #
  102. # Test using a multistep generated file
  103. #
  104. ################################################################
  105. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.pre
  106. DEPENDS ${PROJECT_SOURCE_DIR}/foo.in
  107. COMMAND ${CMAKE_COMMAND}
  108. ARGS -E copy ${PROJECT_SOURCE_DIR}/foo.in
  109. ${PROJECT_BINARY_DIR}/foo.pre
  110. )
  111. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.c
  112. DEPENDS ${PROJECT_BINARY_DIR}/foo.pre
  113. COMMAND ${CMAKE_COMMAND}
  114. ARGS -E copy ${PROJECT_BINARY_DIR}/foo.pre
  115. ${PROJECT_BINARY_DIR}/foo.c
  116. )
  117. # Add custom command to generate not_included.h, which is a header
  118. # file that is not included by any source in this project. This will
  119. # test whether all custom command outputs explicitly listed as sources
  120. # get generated even if they are not needed by an object file.
  121. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/not_included.h
  122. DEPENDS ${PROJECT_SOURCE_DIR}/foo.h.in
  123. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/foo.h.in
  124. ${PROJECT_BINARY_DIR}/not_included.h
  125. )
  126. # Tell the executable where to find not_included.h.
  127. CONFIGURE_FILE(
  128. ${PROJECT_SOURCE_DIR}/config.h.in
  129. ${PROJECT_BINARY_DIR}/config.h
  130. @ONLY IMMEDIATE
  131. )
  132. # add the executable
  133. ADD_EXECUTABLE(CustomCommand
  134. ${PROJECT_BINARY_DIR}/foo.h
  135. ${PROJECT_BINARY_DIR}/foo.c
  136. ${PROJECT_BINARY_DIR}/wrapped.c
  137. ${PROJECT_BINARY_DIR}/wrapped_help.c
  138. ${PROJECT_BINARY_DIR}/generated.c
  139. ${PROJECT_BINARY_DIR}/not_included.h
  140. )
  141. TARGET_LINK_LIBRARIES(CustomCommand GeneratedHeader)
  142. # must add a dependency on TDocument otherwise it might never build and
  143. # the CustomCommand executable really needs doc1.h
  144. ADD_DEPENDENCIES(CustomCommand TDocument)