2016-11-28 21 views
6

Tôi muốn nhắm mục tiêu phiên bản CMake cụ thể cũ hơn phiên bản tôi đang sử dụng (liên quan đến this question, tức là sử dụng chính xác cmake_minimum_required()), và sẽ rất tuyệt có thể xác định các tính năng để tránh xa, ví dụ.Tìm phiên bản CMake nào được giới thiệu trong

Có thể tìm phiên bản đầu tiên mà một tính năng nhất định (biến, hàm, thuộc tính, ...) đã được giới thiệu trong CMake không?

Theo như tôi có thể biết, tài liệu CMake không trực tiếp bao gồm thông tin này (ngoại trừ gián tiếp thông qua ghi chú phát hành). Một ví dụ tuyệt vời về cách làm việc này có thể là tài liệu API Qt (ví dụ: xem tài liệu cho QCryptographicHash).

EDIT: Tôi tạo ra một repo git với một phiên bản sửa đổi của các giải pháp được cung cấp bởi Florian: https://github.com/mbitsnbites/cmake-minver

+1

Sẽ rất tuyệt nếu đây là một phần của tài liệu. Cho đến nay tôi nghĩ rằng chỉ có một cái gì đó giống như [Ma trận tương thích phiên bản CMake] (https://cmake.org/Wiki/CMake_Version_Compatibility_Matrix) (không được cập nhật nữa). Xem thêm [tại đây] (https://cmake.org/pipermail/cmake/2015-October/061747.html). Tôi thường chỉ kiểm tra các lệnh/chính sách/etc. tính khả dụng với ví dụ: 'if (COMMAND ...)'. Một số dự án chỉ cung cấp phiên bản CMake theo yêu cầu của riêng họ. – Florian

+1

Đó là một thất bại lớn trong tài liệu của CMake. Bạn có thể thấy rằng "thủ công" khi đọc một trang: số phiên bản là một phần của url, vì vậy bạn có thể kiểm tra cùng một url với số phiên bản trước đó cho đến khi trang không khả dụng. Đó là khó khăn, nhưng AFAIK không có cách nào khác (cập nhật) cách – wasthishelpful

+0

Cách tiếp cận được mô tả bởi Daniele Domenichelli chắc chắn là thú vị, mặc dù tôi đã hy vọng cho một giải pháp "chính thức" hơn. Có lẽ giải pháp tốt nhất là chỉ cần cài đặt phiên bản mục tiêu của CMake và xây dựng dự án của tôi bằng cách sử dụng nó hầu hết thời gian? –

Trả lời

3

Sau khi đọc các ý kiến ​​ở đây là phiên bản CMake của tôi về một lệnh/tài sản/etc. kiểm tra:

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.5) 

function(version_required_by) 
    set(_keywords ${ARGN}) 
    set(_temp_file "${CMAKE_CURRENT_BINARY_DIR}/download.txt") 
    foreach(_ver IN ITEMS 2.6 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.8.10 2.8.11 2.8.12 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7) 
     message(STATUS "Check version required: ${_ver}") 
     if (_ver VERSION_LESS 2.8) 
      set(_url "https://cmake.org/cmake/help/cmake${_ver}docs.html")     
     elseif (_ver VERSION_LESS 3.0) 
      set(_url "https://cmake.org/cmake/help/v${_ver}/cmake.html") 
     else()     
      set(_url "https://cmake.org/cmake/help/latest/release/${_ver}.html") 
     endif() 
     file(DOWNLOAD "${_url}" "${_temp_file}")     
     file(READ "${_temp_file}" _help_text) 
     foreach(_keyword IN LISTS _keywords) 
      string(FIND "${_help_text}" "${_keyword}" _found) 
      if (NOT _found EQUAL -1) 
       message(STATUS "${_keyword} -> v${_ver}") 
       list(REMOVE_ITEM _keywords "${_keyword}") 
      endif() 
     endforeach() 
     if (NOT _keywords) 
      message("cmake_minimum_required(VERSION ${_ver} FATAL_ERROR)") 
      if (NOT CMAKE_MINIMUM_REQUIRED_VERSION) 
       cmake_minimum_required(VERSION ${_ver} FATAL_ERROR) 
      endif() 
      break() 
     endif() 
    endforeach() 
    if (_keywords) 
     message(FATAL_ERROR "Check version required error: Not found ${_keywords}") 
    endif() 
endfunction() 

if (CMAKE_SCRIPT_MODE_FILE) 
    foreach(_i RANGE 3 ${CMAKE_ARGC}) 
     list(APPEND _args "${CMAKE_ARGV${_i}}") 
    endforeach() 
else() 
    list(
     APPEND _args 
     "string(FIND" 
     "target_include_directories" 
     "BUILDSYSTEM_TARGETS" 
    ) 
endif() 
version_required_by(${_args}) 

sẽ cung cấp cho cho những ví dụ tôi đã sử dụng để thử nghiệm nó:

-- Check version required: 2.6 
... 
-- Check version required: 2.8.5 
-- string(FIND -> v2.8.5 
... 
-- Check version required: 2.8.11 
-- target_include_directories -> v2.8.11 
... 
-- Check version required: 3.7 
-- BUILDSYSTEM_TARGETS -> v3.7 
cmake_minimum_required(VERSION 3.7 FATAL_ERROR) 

Edit: Hoặc nếu bạn ví dụ chạy ở trên trong chế độ kịch bản:

> cmake -P CMakeLists.txt target_include_directories 
-- Check version required: 2.6 
... 
-- Check version required: 2.8.11 
-- target_include_directories -> v2.8.11 
cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR) 

Reference

+0

Đó là một giải pháp ngọt ngào (meta)! Tôi sẽ thử nó. Trong hình thức này (một công cụ địa phương) Tôi nghĩ rằng tôi sẽ biến nó thành một lệnh shell để bạn có thể dễ dàng làm một cái gì đó như 'cmake-minver target_include_directories' và nhận được kết quả trên stdout. –

+0

@ m-bitsnbites Bạn luôn có thể chạy ở trên trong chế độ tập lệnh với 'cmake -P' và kiểm tra các đối số bổ sung với [' CMAKE_ARGV0 ... '] (https://cmake.org/cmake/help/latest/variable /CMAKE_ARGV0.html). Tôi sẽ cập nhật câu trả lời của tôi sau ngày hôm nay cho phù hợp. – Florian

+0

@ m-bitnbites Ok. Sửa đổi kịch bản một chút để nó cũng có thể chạy trong chế độ tập lệnh của CMake. – Florian

0

tôi đã thực hiện một plugin firefox, tên CSince, có sẵn trong https://addons.mozilla.org/firefox/addon/csince/.

Khi xem một trang tài liệu CMake, nó sẽ kiểm tra phiên bản nào mà đối tượng địa lý tương ứng tồn tại và thêm thông tin vào nội dung html.

Kiểm tra đầu tiên được thực hiện cho các phiên bản bắt đầu bằng v3.0: mẫu url được chọn cho các phiên bản trước cho đến khi máy chủ trả về lỗi 404. Ví dụ, xem xét url cho tài sản BINARY_DIR:

https://cmake.org/cmake/help/latest/prop_dir/BINARY_DIR.html 

Đây url được kiểm tra thay thế latest với một chuỗi phiên bản:

https://cmake.org/cmake/help/v3.0/prop_dir/BINARY_DIR.html 
https://cmake.org/cmake/help/v3.1/prop_dir/BINARY_DIR.html 
https://cmake.org/cmake/help/v3.2/prop_dir/BINARY_DIR.html 
... 

phiên bản được kiểm tra sử dụng một cách tiếp cận dichotomic, để hạn chế yêu cầu. Nếu quá trình kiểm tra đầu tiên trả về v3.0, thì lần thứ hai được thực hiện cho các phiên bản cũ hơn bằng cách sử dụng một bài kiểm tra ít tin cậy hơn: tài liệu một trang được yêu cầu, và chuỗi tính năng được tìm kiếm trong văn bản.

Hệ thống hai đường này cho phép tìm phiên bản phù hợp cho thuộc tính BINARY_DIR: chuỗi BINARY_DIR rõ ràng tồn tại trong tài liệu CMake v2.6, trong khi nó tồn tại dưới dạng thuộc tính chỉ từ CMake v3.7.

Bất kỳ báo cáo lỗi hoặc yêu cầu cải tiến nào đều được hoan nghênh. Mã nguồn có sẵn trên GitHub theo giấy phép MIT/X11: https://github.com/wasthishelpful/csince.

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