2013-01-23 31 views
9

Tôi đang sử dụng lệnh sau để sao chép tệp cấu hình vào thư mục xây dựng sau mỗi lần biên dịch.CMake: Cách có mục tiêu sao chép tệp

# Gather list of all .xml and .conf files in "/config" 
file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml 
         ${CMAKE_SOURCE_DIR}/config/*.conf) 

foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET MyTarget PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>) 
endforeach() 

Hành động này được kích hoạt mỗi khi tôi biên dịch dự án. Có thể tạo mục tiêu trong CMakeLists.txt để sao chép tệp mà không cần phải biên dịch bất kỳ thứ gì không? Một cái gì đó như "làm cho bản sao".

Trả lời

24

Bạn sẽ có thể để thêm một mục tiêu tùy chỉnh mới gọi copy và làm cho rằng mục tiêu của bạn tùy chỉnh các lệnh:

file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml 
         ${CMAKE_SOURCE_DIR}/config/*.conf) 

add_custom_target(copy) 
foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET copy PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>) 
endforeach() 

Bây giờ các lệnh tùy chỉnh sẽ chỉ thực hiện nếu bạn xây dựng copy.

Nếu bạn muốn giữ copy mục tiêu này như một sự phụ thuộc của MyTarget để bạn có thể chỉ cần sao chép các tập tin hoặc có họ sao chép nếu bạn xây dựng MyTarget, bạn sẽ cần phải phá vỡ sự phụ thuộc theo chu kỳ. (MyTarget tùy thuộc vào copy, nhưng copy tùy thuộc vào MyTarget để lấy vị trí của thư mục sao chép).

Để làm điều này, bạn có thể dùng đến cách old-fashioned nhận được thư mục đầu ra của một mục tiêu:

add_custom_target(copy) 
get_target_property(MyTargetLocation MyTarget LOCATION) 
get_filename_component(MyTargetDir ${MyTargetLocation} PATH) 
foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET copy PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} ${MyTargetDir}) 
endforeach() 
add_dependencies(MyTarget copy) 
+0

Cảm ơn bạn. Tôi có cần hai lệnh 'add_custom_command' riêng biệt không? một cho mục tiêu thực thi chính và một cho mục tiêu sao chép? Bởi vì ngay bây giờ lệnh tùy chỉnh là một cái gì đó như thế này: 'add_custom_command (TARGET $ {PRODUCT} PRE_BUILD'. Tôi muốn các tệp được sao chép hoặc khi tôi thực hiện mục tiêu chính hoặc khi tôi thực hiện" sao chép " – Meysam

+0

@Meysam Trong trường hợp đó , sử dụng 'add_dependencies ($ {PRODUCT} copy)' để tạo '$ {PRODUCT}' phụ thuộc vào 'copy'. – Angew

+0

@Meysam - Cập nhật câu trả lời – Fraser

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