代码之家  ›  专栏  ›  技术社区  ›  Krupip

如何将相同的参数传递给CMAKE中没有变量的多个目标?

  •  0
  • Krupip  · 技术社区  · 6 年前

    我正在重构一个cmake文件,以便在个人项目中使用现代cmake实践。但是,由于我不认为操作系统是一个广义变量,所以为了在CMAKE中测试操作系统,我必须执行以下操作( based on this answer ):

    if(UNIX AND NOT APPLE)
        set(LINUX TRUE)
    endif()
    #...
    if(LINUX)
        set(MY_PROJECT_LINK_ARGUMENTS ...)
    elseif(WIN32)
        set(MY_PROJECT_LINK_ARGUMENTS ...)
    else()
        message( FATAL_ERROR "Unsupported operating system")
    endif()
    
    add_library(xxx STATIC)
    #...
    target_link_libraries(xxx INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)
    
    add_library(yyy STATIC)
    #...
    target_link_libraries(yyy INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)
    
    add_library(zzz STATIC)
    #...
    target_link_libraries(zzz INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)
    

    我所困惑的是如何在惯用的基于现代目标的CMAKE中实现这一点。由于我不知道存在一个通常封装操作系统的CVALE变量,所以我创建了一个OS变量。

    if(UNIX AND NOT APPLE)
        set(LINUX TRUE)
        set(PROJECT_OS LINUX)
    elseif(APPLE)
        set(PROJECT_OS APPLE)
    elseif(WIN32)
        set(PROJECT_OS WIN32)
    endif()
    

    然后我创建一个生成器表达式

    target_link_libraries(xxx INTERFACE
        $<$<BOOL:$<PROJECT_OS:LINUX>>: ...> 
        $<$<BOOL:$<PROJECT_OS:WIN32>>: ...>
        ...)
    

    但现在我已经创建了一个变量,如果我将相同的参数传递给每个目标( xxx , yyy , zzz )我会把同样的东西复制好几次。

    我认为解决这个问题的唯一方法是使用变量,但是现代的CMAKE指南显然指出我们应该远离变量(例如 A , B ,和 C ),那么我该如何在没有他们的情况下完成这项任务呢?

    1 回复  |  直到 6 年前
        1
  •  0
  •   besc    6 年前

    变量本身并不邪恶。它们有两大潜在问题:

    • 它们引入了全球ish状态,这可能成为维护的噩梦。
    • 它们可能会导致一个未完全导出的CMake项目,为需要在其CMake系统中依赖您的项目的每个人带来问题。

    创建项目全局变量,以便在OSs之间进行更细粒度的区分,这是非常直接的,不存在这些问题。从维护的角度来看,将依赖于操作系统的链接参数放入变量中会让人觉得难闻。Id保留OS变量并将依赖于OS的链接放入函数中,如下所示:

    ...
    function(set_os_dependent_dependencies target_name)
        if (LINUX)
            target_link_libraries(${target_name} ...)
        elseif(WIN32)
            target_link_libraries(${target_name} ...)
        endif()
    endfunction()
    
    add_library(xxx STATIC)
    set_os_dependent_dependencies(xxx)
    ...