2012-04-03 21 views
18

Tôi có một thư viện động mà được một tên khác nhau tùy thuộc vào cấu hình, quy định trong kịch bản CMake bởi:Sao chép mục tiêu tập tin đến một vị trí trong một bài đăng build bước trong CMake

set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64) 
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d) 

Kết quả cuối cùng là tôi lấy tên khác trên bản phát hành và bản dựng gỡ lỗi. Tôi muốn sao chép thư viện kết quả vào một thư mục khác với tư cách là một bước sau khi xây dựng, nhưng món quà (?) Của CMake-Fu đã không mỉm cười khi bạn thực sự.

Tôi đã cố gắng làm điều này:

GET_TARGET_PROPERTY(origfile mylibrary LOCATION) 
STRING(REGEX REPLACE "/" "\\\\" origfile ${origfile}) 

set(targetfile my_target_path\\${CMAKE_CFG_INTDIR}\\) 
STRING(REGEX REPLACE "/" "\\\\" targetfile ${targetfile}) 

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND copy ${origfile} ${targetfile} 
) 

này hoạt động tốt cho phát hành xây dựng, nhưng đối với gỡ lỗi nguồn không bao gồm _D mà tôi lại có thể ngờ. Làm cách nào để có được đường dẫn đầu ra cho mục tiêu sao cho tôi có thể sao chép tệp?

Lưu ý: Như có thể thấy từ đoạn mã trên, đây là phiên bản dành cho Windows/Visual Studio, nhưng tôi cũng muốn làm việc này trên OS X/Xcode/make.

Lưu ý: Tôi cần thư viện được đặt trong thư mục phụ làm thư mục đầu ra cho một số dự án khác phụ thuộc vào thư viện này, để các dự án này có thể tải thư viện lúc chạy. Một giải pháp thay thế có thể chấp nhận được là có thể tạo một mục tiêu tùy chỉnh thực hiện sao chép, sao cho các dự án khác có thể phụ thuộc vào dự án này, do đó phụ thuộc vào thư viện.

Trả lời

34

Thay vì sử dụng lỗi thời LOCATION tài sản, thích sử dụng biểu thức máy phát điện:

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile} 
) 

Bạn cũng có thể chỉ tạo ra exe trong thư mục mục tiêu trực tiếp bằng cách thiết lập mục tiêu sở hữu RUNTIME_OUTPUT_DIRECTORY thay vì sao chép nó. Điều này có các tùy chọn theo cấu hình (ví dụ: RUNTIME_OUTPUT_DIRECTORY_DEBUG).

set_target_properties(mylibrary PROPERTIES 
         RUNTIME_OUTPUT_DIRECTORY_DEBUG <debug path> 
         RUNTIME_OUTPUT_DIRECTORY_RELEASE <release path> 
) 

Để biết thêm chi tiết chạy:

cmake --help-property "RUNTIME_OUTPUT_DIRECTORY" 
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>" 

Ngoài ra, bạn sẽ có thể sử dụng dấu gạch chéo suốt cho dải phân cách đường, ngay cả trên Windows.

+2

Nếu bạn đang nhắm mục tiêu Xcode hoặc Visual Studio, bạn có thể muốn sử dụng RUNTIME_OUTPUT_DIRECTORY thay vào đó và để IDE chăm sóc thêm cấu hình đúng. (như bạn sẽ khám phá ra nếu bạn chạy cmd trợ giúp @Fraser được thêm vào) –

10

Sử dụng generator expressions trong lệnh POST_BUILD thay vì tính toán đường dẫn đầu ra theo cách thủ công. Đây là những nhận biết về cấu hình. Ví dụ:

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND "${CMAKE_COMMAND}" -E copy 
    "$<TARGET_FILE:mylibrary>" 
    "my_target_path/$<CONFIGURATION>/$<TARGET_FILE_NAME:mylibrary>" 
    COMMENT "Copying to output directory") 
Các vấn đề liên quan