2012-11-14 28 views
5

Làm thế nào để cấu hình/hack cmake để xây dựng một tệp thực thi cụ thể được thêm vào với add_executable() nhưng không cài đặt nó?cmake loại trừ khả thi trong khi cài đặt

Thực thi là một bài kiểm tra đơn vị và cuối cùng sẽ được xử lý với add_test nhưng hiện tại tôi chỉ muốn tách các tệp thử nghiệm ra khỏi bản phát hành càng ít càng tốt.

Cảm ơn

Trả lời

4

CMake sẽ chỉ cài đặt một mục tiêu thực thi nếu bạn áp dụng các install chức năng với nó, ví dụ:

install(TARGETS ExecutableTest RUNTIME DESTINATION "bin") 

Để ngăn chặn việc cài đặt của ExecutableTest cho một Release xây dựng, thêm một hạn chế CONFIGURATIONS :

install(TARGETS ExecutableTest RUNTIME DESTINATION "bin" CONFIGURATIONS Debug) 

Hoặc, bạn có thể tạo ExecutableTest một op tional mục tiêu, đó là không được xây dựng theo mặc định:

add_executable(ExecutableTest EXCLUDE_FROM_ALL ${ExecutableTestFiles}) 

và sau đó tùy chọn chỉ cài đặt các ExecutableTest nếu nó đã được xây dựng một cách rõ ràng:

install(TARGETS ExecutableTest RUNTIME DESTINATION "bin" OPTIONAL) 

Tất cả các chỉ tiêu kiểm tra tùy chọn có thể được gộp lại trong một mục tiêu siêu tới cho phép xây dựng chúng trong một bước:

add_custom_target(MyTests DEPENDS ExecutableTest ExecutableTest2 ExecutableTest3) 
+0

tôi cần nó cho cả Debug và phát hành, vì vậy đề nghị đầu tiên, mặc dù won khả thi' t làm việc. một với mục tiêu tùy chọn có vẻ chính xác những gì tôi muốn, sẽ cho nó một thử trong một giây và sẽ cung cấp cho câu trả lời này một chevron ngay sau đó. – bobah

+0

# 2 đã ngăn chặn các bài kiểm tra được xây dựng, Có cách nào để nhóm tất cả các mục tiêu tùy chọn này để có thể nói "làm cho mytests" không? – bobah

+0

xem câu trả lời được cập nhật. – sakra

3

Kể từ EXCLUDE_FROM_ALL có undefined behavior if combined with INSTALL (cmake cố gắng để cảnh báo bạn, nó không quan trọng nếu OPTIONA L được thiết lập), một giải pháp đảm bảo để làm việc phức tạp hơn.

Bạn nên:

  • Remove dependency of "install" target to "all" target (một lần, trong CMakeLists.txt chính):

    set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY true)

  • Thêm BẮT BUỘC minh báo cáo INSTALL trong thư viện thử nghiệm của bạn.Được nhận thức được những lỗi có thể xảy ra CMake Tôi đã báo cáo here

  • Thu thập độc lập toàn bộ các mục tiêu bạn muốn bao gồm trong một tùy chỉnh "all_but_tests" CMake add_custom_target depending on whole project being built (bước khó khăn nhất)

  • Tạo một custom all_but_tests target:

    add_custom_target(all_but_tests DEPENDS <<list of targets>>)

  • Thêm một sự phụ thuộc của đối tượng cài đặt để all_but_tests

    add_dependency(install all_but_tests)

    (Xin lỗi, đây tôi chưa bao giờ cố gắng, thông tin phản hồi được hoan nghênh)

  • Tạo một custom tests target:

    add_custom_target(my_tests DEPENDS <<list of tests>>)

Sau đó (giả bạn đang sử dụng thực hiện, nhưng cũng sẽ hoạt động với ninja):

  • Bạn có thể gọi make install, kích hoạt make all_but_tests và cài đặt sau khi hoàn tất quá trình xây dựng.

  • Bạn có thể gọi make my_tests và sau đó make install, trong trường hợp này, nó sẽ cài đặt mọi thứ. Bạn có thể ghép các lệnh như

    make my_tests && make install

    này hay, vì không có sự khác biệt trong trường hợp này:

    make [all] && make install

Tôi bị thu hút bởi câu hỏi này vì gần đây tôi đã phải đối mặt với sự cố tương tự: Installing only one target and its dependencies

Chỉnh sửa:

add_dependency(install all_but_tests) có thể là not work.

Vì vậy, hoặc là bạn use an adequate workaround, hoặc bạn gọi

make all_but_tests && make install

mọi lúc bạn muốn cài đặt "all_but_tests"

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