2012-04-04 35 views
6

Tôi có một dự án đa nền tảng lớn cần xây dựng ở những nơi khác nhau; ở một số nơi, các bộ công cụ giao diện người dùng khác nhau, API âm thanh, v.v. có thể có sẵn và tôi đang cố gắng tìm ra cách tốt nhất để tự động định cấu hình các mục tiêu nào được định cấu hình dựa trên thư viện nào có mặt.Mục tiêu xây dựng CMake có điều kiện dựa trên sự tồn tại của thư viện

Mã tôi đang cố gắng cho điều đó là, ví dụ:

find_library(PC_EGL EGL) 
find_library(PC_GLESv2 GLESv2) 
find_library(PC_Xxf86vm Xxf86vm) 
if (DEFINED PC_EGL AND DEFINED PC_GLESv2 AND DEFINED PC_Xxf86vm) 
    add_executable(foo foo.cpp) 
    target_link_libraries(foo ${PC_EGL} ${PC_GLESv2} ${PC_Xxf86vm}) 
endif() 

Tuy nhiên, trong trường hợp đó tôi xây dựng này trên một hệ thống mà không có libGLESv2 sẵn, tôi nhận được lỗi:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND. 
Please set them or make sure they are set and tested correctly in the CMake files: 
PC_GLESv2 
    linked by target "foo" in directory /path/to/platform 

Tài liệu find_library ngụ ý rằng biến PC_EGL_NOTFOUND sẽ được đặt, nhưng không phải là (CMake 2.8.5). Vì vậy, cách thích hợp để sử dụng find_library để xác định xem một mục tiêu nên được thực hiện để tồn tại ở tất cả? Có vẻ như sử dụng

if (NOT PC_EGL MATCH "-NOTFOUND") 

là một chút mỏng manh và khó hiểu, vì vậy có cơ chế tốt hơn để xác định đường dẫn lệnh CMake dựa trên thư viện được tìm thấy không?

Trả lời

9

Nó chỉ đơn giản

if(PC_EGL AND PC_GLESv2 AND PC_GLESv2) 

CMake đối xử với 0, FALSE, OFF, ANYTHING-NOTFOUND như sai.

+0

Cảm ơn! Điều đó có vẻ như dễ dàng tìm thấy trong tài liệu hoặc ví dụ, đó là vấn đề thường gặp của tôi với CMake - một khi tôi biết cách làm điều gì đó thật dễ dàng, nhưng tìm cách làm, không quá nhiều. – fluffy

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