统一CMake的FIND_PACKAGE [英] Unifying CMake's FIND_PACKAGE

查看:135
本文介绍了统一CMake的FIND_PACKAGE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您知道从CMake的FIND_PACKAGE中获取包含和库路径时获得统一输出术语的技巧吗?

Do you know a trick to get a unified output terminology when getting include and library paths from CMake's FIND_PACKAGE?

有时它是FOO_INCLUDE。有时是FOO_INCLUDE_PATH。

Sometimes it's FOO_INCLUDE. Sometimes it's FOO_INCLUDE_PATH. Etc.

例如,我想找到一种方法来确保在调用FIND_PACKAGE后将FOO_FOUND设置为TRUE时,始终定义FOO_INCLUDE和FOO_LIB。 p>

For example, I would like to find a way to ensure that FOO_INCLUDE and FOO_LIB be always defined when FOO_FOUND is set to TRUE after a call to FIND_PACKAGE.

推荐答案

将我的评论变成答案

为避免需要了解包含路径,库等的依赖关系及其变量符号,现代的 find_package 的实现确实提供了 IMPORTED 目标,例如 Foo :: Foo 。但是,正如@Tsyvarev所评论的那样,这远远不是通过CMake的所有查找模块

To avoid the need to know the include path, library, etc. dependencies and their variable notations modern find_package's implementation do provide IMPORTED targets like Foo::Foo. But this is - as @Tsyvarev has commented - far from unified through all of CMake's find modules.

因此概括了 CMake的示例查找模块实现,您可以统一 find_package()使用覆盖后的 find_package()宏版本进行调用,如下所示:

So generalizing the CMake's Sample Find Module implementation you could unify your find_package() calls with an overwritten find_package() macro version like the following:

cmake_minimum_required(VERSION 3.2)

project(UnifiedFindPackage)

macro(unify_vars _result)
    set(${_result} "")
    foreach(_i IN ITEMS ${ARGN})
        if (${_i})
            list(APPEND ${_result} "${${_i}}")
        endif()
    endforeach()
endmacro()

macro(find_package _name)
    _find_package(${_name} ${ARGN})
    if (${_name}_FOUND AND NOT TARGET ${_name}::${_name})
        add_library(${_name}::${_name} STATIC IMPORTED GLOBAL)
        unify_vars(_var ${_name}_LIBRARY ${_name}_LIB)
        if (_var)
            set_target_properties(${_name}::${_name} PROPERTIES IMPORTED_LOCATION "${_var}")
        endif()
        if (${_name}_LIBRARY_RELEASE)
            set_property(TARGET ${_name}::${_name} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
            set_target_properties(${_name}::${_name} PROPERTIES IMPORTED_LOCATION_RELEASE "${${_name}_LIBRARY_RELEASE}")
        endif()
        if (${_name}_LIBRARY_DEBUG)
            set_property(TARGET ${_name}::${_name} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
            set_target_properties(${_name}::${_name} PROPERTIES IMPORTED_LOCATION_DEBUG "${${_name}_LIBRARY_DEBUG}")
        endif()            
        if (${_name}_LIBRARIES)
            set_property(TARGET ${_name}::${_name} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${${_name}_LIBRARIES}")
        endif()
        unify_vars(_var ${_name}_INCLUDE_DIRS ${_name}_INCLUDE_PATH)
        if (_var)
            set_property(TARGET ${_name}::${_name} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${_var}")
        endif()
        unify_vars(_var ${_name}_COMPILE_FLAGS ${_name}_DEFINITIONS)
        if (_var)
            set_property(TARGET ${_name}::${_name} APPEND PROPERTY INTERFACE_COMPILE_OPTIONS "${_var}")
        endif()
    endif()            
endmacro()

find_package(MPI REQUIRED)

add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} MPI::MPI)

这应该仅表明可能的统一并且可以根据需要进行扩展。

This should only demonstrate a possible unification and could be extended on a need-by basis.

编辑:将其转变为社区Wiki答案。

Turning this into an community wiki answer. Please feel free to contribute.

在此示例中,使用 MPI 查找模块结果对代码进行了测试。

The code was tested in this example with MPI find module results.

这篇关于统一CMake的FIND_PACKAGE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆