查找引入了哪个CMake版本的功能

时间:2016-11-28 12:28:15

标签: cmake

我想定位比我自己使用的版本更早的CMake的特定版本(与this question相关,即正确使用cmake_minimum_required()),并且能够很好例如,确定远离哪些功能。

是否有可能找到在CMake中引入某个特征(变量,函数,属性......)的第一个版本?

据我所知,CMake文档并未直接包含此信息(通过发行说明间接除外)。 Qt API文档就是一个很好的例子:例如,请参阅QCryptographicHash的文档。

编辑:我创建了一个git repo,其中包含Florian提供的解决方案的修改版本:https://github.com/mbitsnbites/cmake-minver

3 个答案:

答案 0 :(得分:4)

在这里阅读评论后,我的CMake版本的命令/属性/等。检查器:

<强>的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})

会给出我用于测试它的那些例子:

-- 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)

修改或者如果你是以脚本模式运行上面的内容:

> 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)

<强>参考

答案 1 :(得分:1)

问题是known problem,有一些勇敢的人正在努力改善这种情况。 CMake 3.19.0、3.19.1 和即将推出的 3.20.0 在引入功能时添加了 CMake 版本。这发生在 CMake 文档中的数百个地方。请参阅 commits from Nikita Nemkin 之一,以上问题中提供了更多链接。

在 CMake 文档中,它看起来像屏幕截图。请注意 3.xx 版中的新功能,并且屏幕截图是当前的 documentation generated from Git masterenter image description here

从技术上讲,文档中使用 Sphinx 的内置命令 versionadded 对该版本进行了注释。
CMake 提供了一个脚本,用于在 Utilities/Sphinx/stamp_version.py 中生成版本添加信息。

答案 2 :(得分:0)

我制作了一个名为CSince的firefox插件,可在https://addons.mozilla.org/firefox/addon/csince/中找到。

查看CMake文档页面时,会检查相应功能存在的版本,并将信息添加到html内容中。

对从v3.0开始的版本执行第一次检查:检查url模式的先前版本,直到服务器返回404错误。例如,考虑属性BINARY_DIR的网址:

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

此处测试的网址是使用版本字符串替换latest

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
...

使用二分法来测试版本,以限制请求。

如果第一个检查过程返回v3.0,则使用不太可靠的测试对旧版本执行第二次传递:请求单页文档,并在文本中搜索要素字符串。

这个双遍系统允许例如为属性BINARY_DIR找到正确的版本:字符串BINARY_DIR显然存在于CMake文档v2.6中,而它仅作为属性存在,因为CMake V3.7。

欢迎任何错误报告或改进请求。代码源可在GitHub上获得MIT / X11许可证:https://github.com/wasthishelpful/csince