2013-06-10 35 views
9

Tôi đang tạo một chương trình nhỏ yêu cầu tệp hình ảnh foo.bmp để chạy
vì vậy tôi có thể biên dịch chương trình nhưng để chạy nó, tôi phải sao chép foo.bmp để 'xây dựng 'thư mục con theo cách thủ côngCMake: thêm tài nguyên tùy chỉnh để tạo thư mục

Tôi nên sử dụng lệnh nào trong CMakeLists.txt để tự động thêm foo.bmp để xây dựng thư mục con khi chương trình biên dịch?

Trả lời

9

Để 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.

+0

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

+0

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

1

Trong trường hợp điều này có thể hữu ích, tôi đã thử một giải pháp khác bằng lệnh tệp. Có tùy chọn COPY chỉ đơn giản là sao chép một tập tin hoặc thư mục từ nguồn đến đích.

Như thế này: FILE(COPY yourImg.png DESTINATION "${CMAKE_BINARY_DIR}")

con đường tương đối cũng làm việc cho điểm đến (. Bạn chỉ có thể sử dụng ví dụ)

Doc tham khảo: https://cmake.org/cmake/help/v3.0/command/file.html

Các vấn đề liên quan