From KitwarePublic
Jump to: navigation, search

Most real world builds do not only build binaries and libraries, but also various other files, e.g. documentation, translations, etc. Furthermore, complex builds may build intermediate source files or build tools. CMake handles all this using the add_custom_*() commands. Here is a toy model for experimentation:

cmake_minimum_required(VERSION 2.6)
  OUTPUT bla.txt 
  COMMAND cmake -E touch bla.txt
add_custom_target(bla ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/bla.txt)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/bla.txt DESTINATION usr/share/test)

add_custom_command() will create the file bla.txt in the build directory, if and only if, there is a target, which depends on it. add_custom_target() creates such a target. Note that the build dir '${CMAKE_CURRENT_BINARY_DIR}' has to be specified explicitly, since otherwise the dependence would be resolved inside the source tree. In this toy model no such source exists and CMake would fail.

So 'make bla' will create the file, but we added the target to the default target as well, by specifying 'ALL'. This in turn is required by the install() rule. install(FILES ...) is used to copy files somewhere for installation, but install() does not produce a proper dependence. Had we omitted 'ALL' in the target, CMake would run nicely, but 'make && make install' would fail, because bla.txt would not be generated. 'make bla && make install' on the other hand would work!