CMake: adding custom resources to build directory

2019-04-04 20:42发布

问题:

I am making a small program which requires an image file foo.bmp to run
so i can compile the program but to run it, i have to copy foo.bmp to 'build' subdirectory manually

what command should i use in CMakeLists.txt to automatically add foo.bmp to build subdirectory as the program compiles?

回答1:

To do that you should use add_custom_command to generate build rules for file you needs in the build directory. Then add dependencies from your targets to those files: CMake only build something if it's needed by a target.

You should also make sure to only copy files if you're not building from the source directory.

Something like this:

project(foo)

cmake_minimum_required(VERSION 2.8)

# we don't want to copy if we're building in the source dir
if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)

    # list of files for which we add a copy rule
    set(data_SHADOW yourimg.png)

    foreach(item IN LISTS data_SHADOW)
        message(STATUS ${item})
        add_custom_command(
            OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${item}"
            COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${item}"
            DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}"
        )
    endforeach()
endif()

# files are only copied if a target depends on them
add_custom_target(data-target ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/yourimg.png")

In this case I'm using a "ALL" custom target with a dependency on the yourimg.png file to force the copy, but you can also add dependency from one of your existing targets.



回答2:

In case of this might help, I tried another solution using file command. There is the option COPY that simply copy a file or directory from source to dest.

Like this: FILE(COPY yourImg.png DESTINATION "${CMAKE_BINARY_DIR}")

Relative path also works for destination (You can simply use . for instance)

Doc reference: https://cmake.org/cmake/help/v3.0/command/file.html



标签: cmake