2012-08-13 17 views
6

Tôi đang sử dụng Waf để xây dựng một dự án C và gcov để có một số mã vùng thử nghiệm. Tuy nhiên, WAF gọi gcc trong một cách mà sản xuất foo.c.1.o từ nguồn tập tin foo.c gây bối rối gcov khi tìm kiếm các tập tin được tạo ra:Làm cách nào để ngăn Waf đổi tên các tệp đối tượng?

$ gcov foo.c 
$ foo.gcno:cannot open graph file 

May mắn thay, gcov có quyền lựa chọn -o mà người ta có thể xác định các đối tượng tập tin tương ứng . Tuy nhiên, điều này là không thuận tiện và thực hiện lcov vẫn không thành công. Do đó, câu hỏi của tôi là:

  1. Tại sao Waf đổi tên tệp đối tượng?
  2. Cách hoạt động này có thể bị vô hiệu hóa hoặc ...
  3. Làm cách nào để gcov/lcov khắc phục sự cố này?

Trả lời

6

Bạn có thể sử dụng gcovr thay vì trực tiếp chạy gcov.

gcovr không dựa vào tên tệp ma thuật, nhưng phân tích cú pháp tệp bảo hiểm của gcov.
Sau đó, gọi số gcov với các thông số thích hợp.
Điều này hoạt động tốt với việc đổi tên tệp đối tượng của Waf.

Bạn có thể chạy gcovr từ build thư mục con WAF của:

cd build 
gcovr --root=$(pwd) --keep 
lcov --capture --directory $(pwd) --base-directory $(pwd) --output-file coverage.info 
genhtml coverage.info --output-directory out 

Tùy chọn --root loại bỏ các tiền tố thư mục hiện
Tùy chọn --keep giữ gcov 's tập tin tạm thời, được sử dụng bởi lcov/genhtml.

Bạn cũng có thể sử dụng tùy chọn gcovr '--xml để tạo đầu ra xml tương thích Cobertura'.
Sau đó nó có thể được sử dụng bởi nhiều trình định dạng khác nhau (tôi sử dụng nó với Jenkins 'Cobertura Plugin)

+0

Điều này thực sự phức tạp khi làm việc bất chấp câu trả lời rõ ràng. Rõ ràng có một lỗi trong bản sửa đổi chính của gcovr khiến nó đọc từng ký tự của đối số --root như một đường dẫn riêng biệt trong một danh sách. Vì vậy, cho rằng $ (pwd) bắt đầu với '/' nó bắt đầu bằng cách tìm kiếm toàn bộ hệ thống tập tin của bạn cho các tập tin .gcno và treo cứng. Tôi thay đổi dòng 1828, nơi nó gọi get_datafiles để vượt qua "[options.root]" thay vào đó và làm cho nó hoạt động. – flodin

+0

@flodin Lỗi "[options.root]" được sửa trong gcovr 3.2. –

0

Các bạn đã thử thay đổi cấu hình WAF với một cái gì đó giống như

bld.program(
    obj_ext = '.o', 
    source = 'test.c', 
    target = 'test1') 
+3

Dù sao, từ Waf's F.A.Q: 'Q: tại sao foo.cpp lại biên dịch thành foo.cpp. . Ở đâu, là một số? A: khác các tập tin tương tự có thể được biên dịch trong các ngữ cảnh khác nhau và ghi đè lên ' – Eregrith

+0

Thật không may, việc thêm 'obj_ext' không giúp ích gì. Nhưng cảm ơn vì đã chỉ cho tôi lời giải thích không thỏa đáng từ Câu hỏi thường gặp (Tôi tự hỏi tại sao họ không đưa thông tin quan trọng này vào sách Waf). – matthias