| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- #
- # Wrapping
- #
- PROJECT (CustomCommand)
- ADD_SUBDIRECTORY(GeneratedHeader)
- #
- # Lib and exe path
- #
- SET (LIBRARY_OUTPUT_PATH
- ${PROJECT_BINARY_DIR}/bin/ CACHE INTERNAL
- "Single output directory for building all libraries.")
- SET (EXECUTABLE_OUTPUT_PATH
- ${PROJECT_BINARY_DIR}/bin/ CACHE INTERNAL
- "Single output directory for building all executables.")
- ################################################################
- #
- # First test using a compiled generator to create a .c file
- #
- ################################################################
- # add the executable that will generate the file
- ADD_EXECUTABLE(generator generator.cxx)
- GET_TARGET_PROPERTY(generator_PATH generator LOCATION)
- MESSAGE("Location ${generator_PATH}")
- # the folowing assumes that a cmSourceFile
- # is instantiated for the output, with GENERATED 1
- # at the end of the day this becomes a what in VS ?
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/generated.c
- DEPENDS generator
- COMMAND ${generator_PATH}
- ARGS ${PROJECT_BINARY_DIR}/generated.c
- )
- ################################################################
- #
- # Test using a wrapper to wrap a header file
- #
- ################################################################
- # add the executable that will generate the file
- ADD_EXECUTABLE(wrapper wrapper.cxx)
- # the following assumes that a cmSourceFile
- # is instantiated for the output, with GENERATED 1
- # at the end of the day this becomes a what in VS ?
- ADD_CUSTOM_COMMAND(
- OUTPUT ${PROJECT_BINARY_DIR}/wrapped.c ${PROJECT_BINARY_DIR}/wrapped_help.c
- DEPENDS wrapper
- MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/wrapped.h
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/wrapper
- ${PROJECT_BINARY_DIR}/wrapped.c ${PROJECT_BINARY_DIR}/wrapped_help.c
- )
- ################################################################
- #
- # Test creating files from a custom target
- #
- ################################################################
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.dvi
- DEPENDS ${PROJECT_SOURCE_DIR}/doc1.tex
- COMMAND ${CMAKE_COMMAND}
- ARGS -E copy ${PROJECT_SOURCE_DIR}/doc1.tex
- ${PROJECT_BINARY_DIR}/doc1.dvi
- )
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.h
- COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1.dvi to doc1temp.h."
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1.dvi
- ${PROJECT_BINARY_DIR}/doc1temp.h
- )
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/doc1.h APPEND
- DEPENDS ${PROJECT_BINARY_DIR}/doc1.dvi
- COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1temp.h to doc1.h."
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1temp.h
- ${PROJECT_BINARY_DIR}/doc1.h
- COMMAND ${CMAKE_COMMAND} -E echo " Removing doc1temp.h."
- COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJECT_BINARY_DIR}/doc1temp.h
- )
- # Add custom command to generate foo.h.
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.h
- DEPENDS ${PROJECT_SOURCE_DIR}/foo.h.in
- COMMAND ${CMAKE_COMMAND} -E echo " Copying foo.h.in to foo.h."
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/foo.h.in
- ${PROJECT_BINARY_DIR}/foo.h
- )
- # Add the location of foo.h to the include path.
- INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
- # Add a custom target to drive generation of doc1.h.
- ADD_CUSTOM_TARGET(TDocument ALL
- COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1.h to doc2.h."
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1.h
- ${PROJECT_BINARY_DIR}/doc2.h
- DEPENDS ${PROJECT_BINARY_DIR}/doc1.h
- COMMENT "Running top-level TDocument commands"
- )
- # Setup a pre- and post-build pair that will fail if not run in the
- # proper order.
- ADD_CUSTOM_COMMAND(
- TARGET TDocument PRE_BUILD
- COMMAND ${CMAKE_COMMAND} -E echo " Writing doc1pre.txt."
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/doc1.tex ${PROJECT_BINARY_DIR}/doc1pre.txt
- )
- ADD_CUSTOM_COMMAND(
- TARGET TDocument POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E echo " Copying doc1pre.txt to doc2post.txt."
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc1pre.txt
- ${PROJECT_BINARY_DIR}/doc2post.txt
- )
- ################################################################
- #
- # Test using a multistep generated file
- #
- ################################################################
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.pre
- DEPENDS ${PROJECT_SOURCE_DIR}/foo.in
- COMMAND ${CMAKE_COMMAND}
- ARGS -E copy ${PROJECT_SOURCE_DIR}/foo.in
- ${PROJECT_BINARY_DIR}/foo.pre
- )
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.c
- DEPENDS ${PROJECT_BINARY_DIR}/foo.pre
- COMMAND ${CMAKE_COMMAND}
- ARGS -E copy ${PROJECT_BINARY_DIR}/foo.pre
- ${PROJECT_BINARY_DIR}/foo.c
- )
- # Add custom command to generate not_included.h, which is a header
- # file that is not included by any source in this project. This will
- # test whether all custom command outputs explicitly listed as sources
- # get generated even if they are not needed by an object file.
- ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/not_included.h
- DEPENDS ${PROJECT_SOURCE_DIR}/foo.h.in
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/foo.h.in
- ${PROJECT_BINARY_DIR}/not_included.h
- )
- # Tell the executable where to find not_included.h.
- CONFIGURE_FILE(
- ${PROJECT_SOURCE_DIR}/config.h.in
- ${PROJECT_BINARY_DIR}/config.h
- @ONLY IMMEDIATE
- )
- # add the executable
- ADD_EXECUTABLE(CustomCommand
- ${PROJECT_BINARY_DIR}/foo.h
- ${PROJECT_BINARY_DIR}/foo.c
- ${PROJECT_BINARY_DIR}/wrapped.c
- ${PROJECT_BINARY_DIR}/wrapped_help.c
- ${PROJECT_BINARY_DIR}/generated.c
- ${PROJECT_BINARY_DIR}/not_included.h
- )
- TARGET_LINK_LIBRARIES(CustomCommand GeneratedHeader)
- # must add a dependency on TDocument otherwise it might never build and
- # the CustomCommand executable really needs doc1.h
- ADD_DEPENDENCIES(CustomCommand TDocument)
- ##############################################################################
- # Test non-trivial command line arguments in custom commands.
- SET(EXPECTED_ARGUMENTS)
- SET(CHECK_ARGS
- c:/posix/path
- c:\\windows\\path
- 'single-quotes'
- single'quote
- \"double-quotes\"
- double\"quote
- "\\;semi-colons\\;"
- "semi\\;colon"
- `back-ticks`
- back`tick
- "(parens)"
- "(lparen"
- "rparen)"
- $dollar-signs$
- dollar$sign
- &ersands&
- amper&sand
- @two-ats@
- one@at
- "c:/posix/path/with space"
- "c:\\windows\\path\\with space"
- "'single quotes with space'"
- "single'quote with space"
- "\"double-quotes with space\""
- "double\"quote with space"
- "\\;semi-colons with space\\;"
- "semi\\;colon with space"
- "`back-ticks` with space"
- "back`tick with space"
- "(parens) with space"
- "(lparen with space"
- "rparen) with space"
- "$dollar-signs$ with space"
- "dollar$sign with space"
- "&ersands& with space"
- "amper&sand with space"
- "@two-ats@ with space"
- "one@at with space"
- )
- FOREACH(arg ${CHECK_ARGS})
- SET(ARG "${arg}")
- STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARG "${ARG}")
- STRING(REGEX REPLACE "\"" "\\\\\"" ARG "${ARG}")
- SET(EXPECTED_ARGUMENTS
- "${EXPECTED_ARGUMENTS} \"${ARG}\",
- ")
- ENDFOREACH(arg)
- SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
- CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/check_command_line.c.in
- ${CMAKE_CURRENT_BINARY_DIR}/check_command_line.c
- @ONLY IMMEDIATE)
- ADD_EXECUTABLE(check_command_line
- ${CMAKE_CURRENT_BINARY_DIR}/check_command_line.c)
- ADD_CUSTOM_COMMAND(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/command_line_check
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/check_command_line
- ${CHECK_ARGS}
- VERBATIM
- COMMENT "Checking custom command line escapes"
- )
- SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/command_line_check
- PROPERTIES SYMBOLIC 1)
- ADD_CUSTOM_TARGET(do_check_command_line ALL
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/command_line_check
- COMMAND ${CMAKE_COMMAND} -E echo "Checking custom target command escapes"
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/check_command_line
- ${CHECK_ARGS}
- VERBATIM
- )
- ADD_DEPENDENCIES(do_check_command_line check_command_line)
|