目前在理解用CMake创建软件包的正确方法方面有一些困难。
我尝试用各种编译选项构建一个库,并将其用作可重定位的包。我有一个类似于下面的CMakeLists.txt
:
add_library(Lib lib.cpp lib.h)
if (WITH_FOO)
find_package(Foo REQUIRED)
target_link_libraries(Lib Foo::Foo)
endif()
if (WITH_BAR)
find_package(Bar REQUIRED)
target_link_libraries(Lib Bar::Bar)
endif()
if (WITH_OTHER_TARGET)
add_library(OtherTarget other_target.cpp other_target.h)
target_link_libraries(Lib OtherTarget)
endif()
include(GNUInstallDirs)
install(TARGETS Lib
EXPORT LibTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(EXPORT LibTargets
FILE LibTargets.cmake
NAMESPACE Lib::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Lib
)
include(CMakePackageConfigHelpers)
configure_package_config_file(
LibConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/LibConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Lib
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/LibConfig.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Lib
)
据我所知,所有公共依赖项都应该列在LibConfig.cmake
文件中。
正确的方法是什么?我可以这样做:
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/LibTargets.cmake")
include(CMakeFindDependencyMacro)
if (@WITH_FOO@)
find_dependency(Foo)
endif()
if (@WITH_BAR@)
find_dependency(Bar)
endif()
但这似乎很容易出错,因为我必须记住为每一个新添加的公共依赖项添加find_dependency
。
我还尝试使用Lib
目标的INTERFACE_LINK_LIBRARIES
属性,但这似乎相当不可靠,因为它与我自己的目标和其他东西(如-lpthread
)混杂在一起。
我有点迷路了。做这件事的正确方法是什么?我做这件事全错了吗?
1条答案
按热度按时间5cnsuln71#
是的,在项目的
CMakeLists.txt
中的每个find_package
调用的配置文件中有find_dependency
调用是正确的。如果您有许多条件
find_package
调用,并且希望避免在配置文件中进行相应的条件find_dependency
调用,那么您可以准备一些变量,用于“联机”收集所有这些调用。因此,在配置文件的模板中,您将具有
可以使用GLOBAL属性来代替变量,该属性可以从任何作用域更新,而不仅仅是从顶层
CMakeLists.txt
:配置文件的模板将相同: