Created
August 24, 2015 03:45
-
-
Save socantre/7ee63133a0a3a08f3990 to your computer and use it in GitHub Desktop.
Example of using add_custom_command and add_custom_target together in CMake to handle custom build steps with minimal rebuilding: This example untars library headers for an INTERFACE library target
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
set(LIBFOO_TAR_HEADERS | |
"${CMAKE_CURRENT_BINARY_DIR}/include/foo/foo.h" | |
"${CMAKE_CURRENT_BINARY_DIR}/include/foo/foo_utils.h" | |
) | |
add_custom_command(OUTPUT ${LIBFOO_TAR_HEADERS} | |
COMMAND ${CMAKE_COMMAND} -E tar xzf "${CMAKE_CURRENT_SOURCE_DIR}/libfoo/foo.tar" | |
COMMAND ${CMAKE_COMMAND} -E touch ${LIBFOO_TAR_HEADERS} | |
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include/foo" | |
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/libfoo/foo.tar" | |
COMMENT "Unpacking foo.tar" | |
VERBATIM | |
) | |
add_custom_target(libfoo_untar DEPENDS ${LIBFOO_TAR_HEADERS}) | |
add_library(foo INTERFACE) | |
target_include_directories(foo INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/include/foo") | |
target_link_libraries(foo INTERFACE ${FOO_LIBRARIES}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you for posting this. I am perplexed about one thing though.
add_library
andadd_executable
know that source files are present in${CMAKE_CURRENT_SOURCE_DIR}
so we don't need to explicitly mention it. But,add_custom_command
needs the full path to a file in the current source directory. So,results in
no input files: cannot find cross_compiled_file.cpp
error from the compiler. The behavior of cmake seems inconsistent here.I guess the reasoning is that the custom_command could be anything so cmake isn't going to assume anything.