Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake: adding custom resources to build directory

Tags:

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?

like image 551
Archit Avatar asked Jun 10 '13 07:06

Archit


2 Answers

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

like image 103
geekymoose Avatar answered Sep 27 '22 22:09

geekymoose


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.

like image 33
Guillaume Avatar answered Sep 27 '22 22:09

Guillaume