2012-10-29 28 views
35

Tôi đang sử dụng CMake với dự án của mình và thiết lập máy chủ cdash để xây dựng liên tục/đêm. Tất cả mọi thứ hoạt động tốt và bằng cách thiết lập một crontab, chúng tôi có kết quả xây dựng/kiểm tra hàng giờ/hàng đêm được tải lên máy chủ cdash của chúng tôi tự động.Hướng dẫn chi tiết về cách sử dụng gcov với CMake/CDash?

Bước tiếp theo của tôi là thêm báo cáo phủ sóng thử nghiệm vào bản dựng. Tôi tìm thấy các tài liệu ở đây http://www.cmake.org/Wiki/CTest:Coverage nhưng thẳng thắn nó là một chút xa một hướng dẫn thực tế.

Hiện tại tôi đã thêm cờ bắt buộc (thay vì -fprofile-arcs -ftest-coverage, tôi tìm thấy --coverage tốt hơn), quá trình biên dịch tạo tệp .gcno. Nhưng sau đó tôi bị mắc kẹt. Lệnh

make NightlyCoverage 

dường như không làm gì cả. Ai có thể cho tôi biết tiếp theo sẽ làm gì? Kết quả mà tôi muốn, là bằng cách thực hiện make NightlyCoverage, báo cáo bảo hiểm được tạo và tải lên máy chủ cdash.

Trả lời

39

Tôi đã sử dụng thành công https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake.

Chỉ cần theo nguyên tắc này: thêm các tập tin vào thư mục CMAKE_MODULE_PATH của tôi, thêm

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules) 
if(CMAKE_COMPILER_IS_GNUCXX) 
    include(CodeCoverage) 
    setup_target_for_coverage(${PROJECT_NAME}_coverage ${PROJECT_TEST_NAME} coverage) 
endif() 

trong CMakeLists.txt tôi. Tôi cũng đã thêm bằng tay gcov như một sự phụ thuộc đối với mục tiêu của tôi:

if(CMAKE_COMPILER_IS_GNUCXX) 
    target_link_libraries(${PROJECT_TEST_NAME} gcov) 
endif() 

Với điều này, tôi chỉ cần gõ

make my_project_coverage 

và tôi nhận được báo cáo html trong coverage thư mục build cây của tôi.

+3

Liên kết tới gcov isn' t thực sự cần thiết. Gcc làm điều đó tự động anyway, và nó sẽ không làm việc với Clang ví dụ mà thay vào đó nên liên kết againt libprofile_rt – Joakim

+2

Tôi sẽ thêm một lưu ý rằng tôi đang sử dụng clang trên OSX và bên cạnh một cảnh báo trong CodeCoverage.cmake, giải pháp này hoạt động hoàn hảo. – nevelis

+3

@rcomblen Liệu tổng hợp các kết quả bảo hiểm cho tất cả các thử nghiệm của bạn? Hay bạn cần phải setup_target_for_coverage cho mọi mục tiêu thử nghiệm? –

0

Tôi có một phương pháp xấu xí để sử dụng gcovr để thực hiện một báo cáo GCC Mã Vùng phủ sóng mà không CodeCoverage.cmake: di chuyển tất cả *.gcno*.gcda file dự án thư mục gốc và sau đó chạy gcovr

$ cd /path/to/your/project 
$ mkdir build && cd build && cmake .. 
$ make && make test 
$ find . -type f \(-iname \*.gcno -or -iname \*.gcda \) -exec cp {} .. \; 
$ cd .. 
$ gcovr -v -r . 
Các vấn đề liên quan