仅在满足依赖性时才创建CMake目标

时间:2016-01-05 16:51:18

标签: cmake build-dependencies

我有一个包含多个库和可执行文件的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说“这些目标需要这些目标,如果遗失,则省略目标”。

有更简单(或更正确)的方法吗?

1 个答案:

答案 0 :(得分:1)

  

这些目标需要这些目标,如果遗失,则省略目标

据我所知,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 ...)