我有一个包含多个库和可执行文件的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说“这些目标需要这些目标,如果遗失,则省略目标”。
有更简单(或更正确)的方法吗?
答案 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 ...)