2010-06-28 45 views
24

Tôi hiện đang nghiên cứu sử dụng cmake để xây dựng một số dự án, với nền tảng chính là Visual C++, MinGW GCC và Linux GCC. Khi xây dựng với GCC, tôi cần phải chỉ định tùy chọn biên dịch -Wno-invalid-offsetof.Làm cách nào để áp dụng các tùy chọn trình biên dịch khác nhau cho các trình biên dịch khác nhau trong cmake?

sửa chữa hiện tại của tôi là như sau ...

if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio" 
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake" 
    ) 
    set (CPPLIB_COMPILER_OPTS "") 
else() 
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof") 
endif() 

... 

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}") 
# repeated for all targets 

này hoạt động, nhưng giả định rằng tất cả các máy phát điện khác so với những hình ảnh studio sẽ xây dựng với gcc rõ ràng là không an toàn. Để bắt đầu, có máy phát IIRC cho các trình biên dịch Borland. Quan trọng hơn, việc sử dụng make không phải lúc nào cũng có nghĩa là sử dụng gcc.

Trình biên dịch khác mà tôi có thể sử dụng là llvm-gcc và clang. May mắn thay, tôi nghĩ ngay cả clang cũng hỗ trợ các tùy chọn tương thích với gcc. Nhưng logic này chỉ tốt cho đến khi mã liên quan không bao giờ được giải phóng.

Cmake xuất hiện để kiểm tra các trình biên dịch có sẵn và tạo ra một tệp makefile dành riêng cho trình biên dịch đó (nêu câu hỏi - tại sao không ít nhất có tùy chọn xây dựng dự án trực tiếp, mà không cần một người trung gian như tạo?).

Đó là trường hợp, tôi đã hy vọng có thể kiểm tra trực tiếp cho gcc trong các tệp CMakeLists.txt của tôi. Cho đến nay, mặc dù, tôi không thể tìm thấy một biến thích hợp để kiểm tra hoặc bất kỳ giải pháp rõ ràng nào khác.

Điều này có khả thi không?

Trả lời

35

Để tạo hệ thống xây dựng di động, tốt nhất là không thử nghiệm nền tảng, nhưng để thử nghiệm các tính năng.

Thay vì thử nghiệm "nếu Windows sau đó thực hiện việc này", hãy kiểm tra "nếu cờ -Wno-invalid-offsetof hoạt động sau đó sử dụng nó". Bạn có thể làm điều đó với các mô-đun CheckCCompilerFlag, ví dụ:

include(CheckCCompilerFlag) 
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF) 
if (HAS_NO_INVALID_OFFSETOF) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof") 
endif() 

Đối với C++ có một CheckCXXCompilerFlag tương tự với một lệnh check_cxx_compiler_flag(flag var).

+1

Điều đó thật hoàn hảo! Một điều không liên quan, mặc dù ... không có nhiều điểm kiểm tra tùy chọn đó cho C, vì không có thứ gì như một offsetof không hợp lệ trong C - nó chỉ xảy ra trong C++. – Steve314

+0

Tôi không biết điều đó. Trong thực tế, tôi không biết tùy chọn là gì nhưng nó có ý nghĩa hoàn hảo, vì C chỉ có các loại POD http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html. Và CMake bỏ qua cảnh báo trình biên dịch trong quá trình kiểm tra - "nếu nó biên dịch nó hoạt động". – richq

+0

Có cách nào để kiểm tra kết hợp các tùy chọn không? Ngoài ra, tôi muốn đảm bảo không có cảnh báo thời gian biên dịch nên cũng đang tìm cách điều tra cảnh báo. – thoni56

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