2015-06-05 15 views
7

Vì vậy, tôi đã thiết lập một metaproject, có nghĩa là tôi có một thư mục (thư mục gốc) có chứa nhiều thư mục con, mỗi trong số đó là một dự án cmake (với một cmakelists hợp lệ). Các cmakelists trong thư mục gốc nhập khẩu các tiểu dự án bằng lệnh cmake add_subdirectory.Làm thế nào để tránh xung đột tên trong các tiểu dự án cmake?

Mỗi tiểu dự án xác định mục tiêu riêng (thư viện và tệp thực thi) cũng như mục tiêu "kiểm tra" thực thi bộ thử nghiệm cho dự án đó và "tài liệu" chạy doxygen.

Vấn đề của tôi là CMake không hiểu rằng mục tiêu kiểm tra và tài liệu là địa phương cho từng dự án và do đó phàn nàn về các xung đột về tên.

Vì vậy, câu hỏi của tôi là, có cách nào để hiểu rõ rằng các mục tiêu này là cục bộ cho từng dự án không?

Trả lời

1

CMake không cho phép tên mục tiêu trùng lặp. Lý do được cung cấp trong docs for policy CMP0002:

  • tên độc đáo có thể được tham chiếu một cách rõ ràng cả trong CMake mã và make dòng lệnh công cụ.
  • Tên hợp lý được sử dụng bởi máy phát Xcode và VS IDE để tạo tên dự án có ý nghĩa cho các mục tiêu.

của bạn có thể thử thiết CMP0002-OLD (thực hiện thông qua cmake_policy(SET CMP0002 OLD)) mà sẽ ít nhất là thoát khỏi các lỗi CMake, nhưng tôi khuyên bạn nên chống lại điều đó - chắc chắn nó sẽ không làm việc cho MSVC/Xcode. Tùy chọn duy nhất tôi có thể thấy ngắn tên mã hóa duy nhất sẽ là viết một hàm CMake tạo ra một tên duy nhất cho mỗi mục tiêu "kiểm tra" - ví dụ nó có thể chắp thêm tên của mục tiêu đang được kiểm tra, năng suất những cái tên như check_my_lib_one, check_my_exe_one vv

chức năng này cũng có thể được sử dụng để thu thập một danh sách của tất cả các thành viên check_<Target> trường và thêm chúng vào một mục tiêu duy nhất gọi là check đó sẽ gọi mỗi cấp dưới check_<Target>, vì vậy chạy make check chạy tất cả chúng .

+0

Vâng, tôi đang tìm kiếm một thứ như "một không gian tên trên mỗi dự án" loại giải pháp, nhưng điều đó dường như không tồn tại trong cmake, vì vậy tôi sẽ sử dụng giải pháp của bạn, cảm ơn! –

+0

@ Tóm tắt-Sky về mặt kỹ thuật, bạn có thể tự mình sử dụng quy ước không gian tên. Ví dụ: tiền tố tất cả các mục tiêu của dự án theo tên dự án. – ibizaman

+0

@ibizaman Đó là whay tôi đã kết thúc, bằng cách sử dụng macro để tự động thêm tiền tố. –

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