1

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

例如:

  • libFOO-> 取决于libX11(比如说)
  • execBAR-> 取决于libFOO
  • exexQUUX-> 没有部门

在安装了 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 说“这些目标需要这些部门,如果缺少,则省略目标”。

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

4

1 回答 1

1

这些目标需要这些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 ...)
于 2016-01-05T23:24:08.557 回答