CMakeLists.txt 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #
  2. # Wrapping
  3. #
  4. PROJECT (CustomCommand)
  5. #
  6. # Lib and exe path
  7. #
  8. SET (LIBRARY_OUTPUT_PATH
  9. ${PROJECT_BINARY_DIR}/bin/ CACHE PATH
  10. "Single output directory for building all libraries.")
  11. SET (EXECUTABLE_OUTPUT_PATH
  12. ${PROJECT_BINARY_DIR}/bin/ CACHE PATH
  13. "Single output directory for building all executables.")
  14. ################################################################
  15. #
  16. # First test using a compiled generator to create a .c file
  17. #
  18. ################################################################
  19. # add the executable that will generate the file
  20. ADD_EXECUTABLE(generator generator.cxx)
  21. GET_TARGET_PROPERTY(generator_PATH generator LOCATION)
  22. MESSAGE("Location ${generator_PATH}")
  23. # the folowing assumes that a cmSourceFile
  24. # is instantiated for the output, with GENERATED 1
  25. # at the end of the day this becomes a what in VS ?
  26. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/generated.c
  27. DEPENDS generator
  28. COMMAND ${generator_PATH}
  29. ARGS ${PROJECT_BINARY_DIR}/generated.c
  30. )
  31. ################################################################
  32. #
  33. # Test using a wrapper to wrap a header file
  34. #
  35. ################################################################
  36. # add the executable that will generate the file
  37. ADD_EXECUTABLE(wrapper wrapper.cxx)
  38. # the following assumes that a cmSourceFile
  39. # is instantiated for the output, with GENERATED 1
  40. # at the end of the day this becomes a what in VS ?
  41. ADD_CUSTOM_COMMAND(
  42. OUTPUT ${PROJECT_BINARY_DIR}/wrapped.c
  43. DEPENDS wrapper
  44. MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/wrapped.h
  45. COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/wrapper
  46. ARGS ${PROJECT_BINARY_DIR}/wrapped.c ${PROJECT_SOURCE_DIR}/wrapped.h
  47. )
  48. ################################################################
  49. #
  50. # Test creating files from a custom target
  51. #
  52. ################################################################
  53. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.dvi
  54. DEPENDS ${PROJECT_SOURCE_DIR}/doc1.tex
  55. COMMAND ${CMAKE_COMMAND}
  56. ARGS -E copy ${PROJECT_SOURCE_DIR}/doc1.tex
  57. ${PROJECT_BINARY_DIR}/doc1.dvi
  58. )
  59. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.h
  60. DEPENDS ${PROJECT_BINARY_DIR}/doc1.dvi
  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. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1temp.h to doc1.h."
  65. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1temp.h
  66. ${PROJECT_BINARY_DIR}/doc1.h
  67. COMMAND ${CMAKE_COMMAND} -E echo " Removing doc1temp.h."
  68. COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/doc1temp.h
  69. )
  70. # Add custom command to generate foo.h.
  71. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.h
  72. DEPENDS ${PROJECT_SOURCE_DIR}/foo.h.in
  73. COMMAND ${CMAKE_COMMAND} -E echo " Copying foo.h.in to foo.h."
  74. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/foo.h.in
  75. ${PROJECT_BINARY_DIR}/foo.h
  76. )
  77. # Add the location of foo.h to the include path.
  78. INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
  79. # Add a custom target to drive generation of doc1.h.
  80. ADD_CUSTOM_TARGET(TDocument ALL
  81. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1.h to doc2.h."
  82. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1.h
  83. ${PROJECT_BINARY_DIR}/doc2.h
  84. DEPENDS ${PROJECT_BINARY_DIR}/doc1.h
  85. )
  86. # Setup a pre- and post-build pair that will fail if not run in the
  87. # proper order.
  88. ADD_CUSTOM_COMMAND(
  89. TARGET TDocument PRE_BUILD
  90. COMMAND ${CMAKE_COMMAND} -E echo " Writing doc1pre.txt."
  91. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/doc1.tex ${PROJECT_BINARY_DIR}/doc1pre.txt
  92. )
  93. ADD_CUSTOM_COMMAND(
  94. TARGET TDocument POST_BUILD
  95. COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1pre.txt to doc2post.txt."
  96. COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1pre.txt
  97. ${PROJECT_BINARY_DIR}/doc2post.txt
  98. )
  99. ################################################################
  100. #
  101. # Test using a multistep generated file
  102. #
  103. ################################################################
  104. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.pre
  105. DEPENDS ${PROJECT_SOURCE_DIR}/foo.in
  106. COMMAND ${CMAKE_COMMAND}
  107. ARGS -E copy ${PROJECT_SOURCE_DIR}/foo.in
  108. ${PROJECT_BINARY_DIR}/foo.pre
  109. )
  110. ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.c
  111. DEPENDS ${PROJECT_BINARY_DIR}/foo.pre
  112. COMMAND ${CMAKE_COMMAND}
  113. ARGS -E copy ${PROJECT_BINARY_DIR}/foo.pre
  114. ${PROJECT_BINARY_DIR}/foo.c
  115. )
  116. # These object dependencies can be removed to test the
  117. # auto-object-depends feature of the Makefile generator. Currently
  118. # the feature does not seem to work in Visual Studio generators so
  119. # these dependencies are needed.
  120. SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/foo.c PROPERTIES
  121. OBJECT_DEPENDS "${PROJECT_BINARY_DIR}/doc1.h;${PROJECT_BINARY_DIR}/foo.h")
  122. # add the library
  123. ADD_EXECUTABLE(CustomCommand
  124. ${PROJECT_BINARY_DIR}/foo.c
  125. ${PROJECT_BINARY_DIR}/wrapped.c
  126. ${PROJECT_BINARY_DIR}/generated.c
  127. )
  128. # must add a dependency on TDocument otherwise it might never build and
  129. # the CustomCommand executable really needs doc1.h
  130. ADD_DEPENDENCIES(CustomCommand TDocument)