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

仅当满足依赖项时才创建CMake目标

  •  2
  • diwhyyyyy  · 技术社区  · 9 年前

    我有一个包含多个库和可执行文件的CMake项目。有些目标具有依赖关系,可能不是在所有平台上都能满足。在这种情况下,我希望CMake工作并生成有意义的Makefiles(或其他构建项目)。

    例如:

    • libFOO ->取决于 libX11 (说)
    • execBAR ->取决于 图书馆FOO
    • exexQUUX ->无deps

    在安装了libX11的系统上,可以构建所有目标。在没有的系统上,仅 execQUUX 将可用于构建。

    目前我正在做这样的事情:

    # work out if we can build this target
    set(buildLibFOO LibX11_FOUND)
    
    if (${buildLibFOO})
        add_library(libFOO ... )
        target_link_libraries(libFOO LibX11_LIBRARY)
    endif()
    
    set(buildExecBAR true)
    
    # work out if we can build this target
    if (NOT TARGET libFOO)
        set(buildExecBAR false)
    endif()
    
    if (${buildExecBAR})
        add_exec(execBAR ...)
        target_link_libraries(execBAR libFOO)
    endif() 
    
    # always build this one
    add_exec(execQUUX ...)
    

    然而,这感觉有点笨拙,因为我需要仔细考虑为每个目标检查什么,而不是对CMake说“这些目标需要这些dep,如果缺失,请忽略目标”。

    有没有更简单(或更正确)的方法来做到这一点?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Tsyvarev    9 年前

    这些目标需要这些dep,如果缺少,请忽略目标

    据我所知,CMake中没有这样的功能。

    但您可以创建函数,该函数仅在满足依赖关系时添加库/可执行文件。大致如下:

    include(CMakeParseArguments)
    
    # Similar as *add_executable*, but additionally accepts DEPENDS option.
    # All arguments after this option are treated as libraries targets for link with;
    # executable is created only when these targets exist.
    function(add_executable_depends name)
        cmake_parse_arguments(MY_EXEC "" "" "DEPENDS" ${ARGN})
        foreach(depend ${MY_EXEC_DEPENDS})
            if(NOT TARGET ${depend})
                return()
            endif()
        endforeach()
        add_executable(${name} ${MY_EXEC_UNPARSED_ARGUMENTS})
        target_link_libraries(${name} ${MY_EXEC_DEPENDS})
    endfunction()
    

    用法示例:

    # work out if we can build this target
    set(buildLibFOO LibX11_FOUND)
    
    if (${buildLibFOO})
        add_library(libFOO ... )
        target_link_libraries(libFOO LibX11_LIBRARY)
    endif()
    
    # Add executable (and link with libFOO) only when libFOO exists.
    add_executable_depends(execBAR ... DEPENDS libFOO)
    
    # always build this one(similar to add_executable)
    add_executable_depends(execQUUX ...)