2013-09-03 33 views
6

Tôi có tệp cmake hiện có để tạo thư viện .so. Tôi muốn sửa đổi nó để nó sau đó sẽ tạo một bản sao của .so đặt tên khác. Đây là những gì tôi có:lệnh tùy chỉnh cmake để sao chép và đổi tên

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7) 
PROJECT(test1) 

SET(TEST_SOURCES f1.c) 
ADD_LIBRARY(test SHARED ${TEST_SOURCES}) 
ADD_CUSTOM_COMMAND(
    OUTPUT custom1 
    COMMAND cp libtest.so custom1 
    DEPENDS libtest.so) 

Tôi nhận ra có những cách tốt hơn mã hóa tên thư viện, tôi chỉ làm điều này trong khi tôi cố gắng tìm ra cách làm cho nó hoạt động. Tôi thiếu điều gì sẽ khiến lệnh sao chép/đổi tên của tôi chạy? Lưu ý: đây không phải là điều cài đặt. Cảm ơn

Trả lời

6
add_custom_target(CopyAndRename 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/test.so ${CMAKE_BINARY_DIR}/SomeThingElse.so 
) 

add_custom_target giới thiệu một mục tiêu mới có tên là CopyAndRename. Bạn có thể chạy nó với:

make CopyAndRename 
11

Tôi muốn theo ý tưởng ban đầu của bạn về việc sử dụng add_custom_command. Tuy nhiên, tôi khuyên bạn nên sử dụng biểu mẫu add_custom_command(TARGET ...) thay vì add_custom_command(OUTPUT ...).

Phiên bản OUTPUT được thiết kế để có tệp đầu ra được sử dụng dưới dạng tệp nguồn trong một mục tiêu CMake khác trong cùng một CMakeLists.txt. Lệnh tùy chỉnh được gọi khi mục tiêu này được xây dựng (ngay tại đầu), vì mục tiêu cần tệp tồn tại tại thời điểm đó.

Trong trường hợp của bạn, không có mục tiêu nào phụ thuộc vào tệp của bạn - đó là sản phẩm của quá trình tạo.

Nếu bạn sử dụng add_custom_command(TARGET ...), điều này đảm bảo lệnh được thực hiện mỗi khi mục tiêu được xây dựng lại. Sử dụng add_custom_target yêu cầu bạn phải nhớ để xây dựng này nếu mục tiêu ban đầu (test trong trường hợp này) được cập nhật. Nó cũng không cần thiết thêm vào danh sách các mục tiêu của bạn - có thể không phải là một vấn đề cho một dự án nhỏ bé, nhưng nó có thể là cho các dự án lớn hơn.

Đây là cách tôi muốn thiết lập lệnh:

SET(COPY_TO_PATH custom1) 
ADD_CUSTOM_COMMAND(TARGET test POST_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
         $<TARGET_FILE:test> 
         ${COPY_TO_PATH} 
        COMMENT "Copying 'test' library to '${COPY_TO_PATH}'") 

này thêm lệnh như một hậu xây dựng trường hợp test 's. Khi bạn xác định đúng, tên thư viện mã hóa cứng không phải là tuyệt vời; do đó CMake cung cấp "biểu thức máy phát điện" để xử lý điều này. Biểu thức máy phát điện $<TARGET_FILE:test> giải quyết đường dẫn đầy đủ của thư viện được tạo bởi test, bất kể nền tảng hoặc trình biên dịch. Lưu ý rằng biểu thức trình tạo chỉ có thể được sử dụng trong đối số COMMAND; bạn không thể sử dụng chúng trong ví dụ COMMENT.

Lệnh thực tế đang gọi CMake chính nó (${CMAKE_COMMAND}) với số -E command line option. Điều này cung cấp một cách đa nền tảng để đạt được bản sao, vì cp không phải là một lệnh Windows. Để xem tất cả các tùy chọn -E, hãy chạy cmake -E help.

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