Để làm điều đó, bạn nên sử dụng add_custom_command để tạo quy tắc xây dựng cho tệp bạn cần trong thư mục xây dựng. Sau đó, thêm phụ thuộc từ các mục tiêu của bạn vào các tập tin đó: CMake chỉ xây dựng một cái gì đó nếu nó cần thiết bởi một mục tiêu.
Bạn cũng nên đảm bảo chỉ sao chép tệp nếu bạn không xây dựng từ thư mục nguồn.
Something như thế này:
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")
Trong trường hợp này tôi đang sử dụng một "TẤT CẢ" mục tiêu tùy chỉnh với một sự phụ thuộc vào các tập tin yourimg.png để buộc các bản sao, nhưng bạn cũng có thể thêm phụ thuộc từ một của các mục tiêu hiện tại của bạn.
những gì hiện add_custom_target dòng làm. tôi đã cố gắng sửa đổi mã của bạn và bao gồm vòng lặp foreach cho dòng add_custom_target quá nhưng không thành công trên nhiều tệp – Archit
Vâng, tôi đoán bạn có vấn đề với phụ thuộc ... như tôi đã nói chỉ các tệp cần thiết theo mục tiêu được tạo. Vì vậy, nếu không có mục tiêu phụ thuộc vào hình ảnh của bạn, chúng sẽ không được xây dựng. Đó là lý do tại sao tôi thêm "add_custom_target" trong ví dụ của mình. Btw một quy tắc tốt hơn có thể là 'add_custom_target (data-target ALL DEPENDS $ {data_SHADOW})' do đó nó luôn phụ thuộc vào tất cả các hình ảnh. – Guillaume