CMakeLists.txt 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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
  44. DEPENDS wrapper
  45. MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/wrapped.h
  46. COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/wrapper
  47. ARGS ${PROJECT_BINARY_DIR}/wrapped.c ${PROJECT_SOURCE_DIR}/wrapped.h
  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. # These object dependencies can be removed to test the
  118. # auto-object-depends feature of the Makefile generator. Currently
  119. # the feature does not seem to work in Visual Studio generators so
  120. # these dependencies are needed.
  121. #SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/foo.c
  122. #PROPERTIES
  123. # OBJECT_DEPENDS "${PROJECT_BINARY_DIR}/doc1.h;${PROJECT_BINARY_DIR}/foo.h"
  124. #)
  125. # add the library
  126. ADD_EXECUTABLE(CustomCommand
  127. ${PROJECT_BINARY_DIR}/foo.c
  128. ${PROJECT_BINARY_DIR}/wrapped.c
  129. ${PROJECT_BINARY_DIR}/generated.c
  130. )
  131. TARGET_LINK_LIBRARIES(CustomCommand GeneratedHeader)
  132. # must add a dependency on TDocument otherwise it might never build and
  133. # the CustomCommand executable really needs doc1.h
  134. ADD_DEPENDENCIES(CustomCommand TDocument)