首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅在构建阶段执行cmake::find_package

如何仅在构建阶段执行cmake::find_package
EN

Stack Overflow用户
提问于 2017-07-08 21:38:33
回答 1查看 1.8K关注 0票数 3

我正在尝试将基于cmake的项目作为github存储库的外部项目,使之成为库vlc-qt。

该项目采用建议的方式:

代码语言:javascript
复制
FIND_PACKAGE(VLCQt REQUIRED COMPONENTS Widgets)

cmake在配置阶段执行此命令,因此您可以看到库不是在此基础上构建的。

避免这种情况的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2017-07-08 22:22:36

将您自己的项目和VLCQt项目与ExternalProject_Add一起放到外部项目中,并创建一个顶级CMakeLists.txt文件来一个接一个地构建它们。

您的目录结构如下所示:

代码语言:javascript
复制
ProjectRoot/
|-- CMakeLists.txt
|-- MyProject/
|   |-- sources/
|   `-- CMakeLists.txt
`-- modules/
    |-- MyProject.cmake
    `-- ExternalVLCQt.cmake

ProjectRoot/modules/ExternalVLCQt.cmake看起来可能如下:

代码语言:javascript
复制
set(VLCQT_ROOT ${EXT_INSTALL_PATH}/vlcqt CACHE INTERNAL "")

ExternalProject_Add(vlcqt
    URL "http://url.of.source/release.0.1.tar.gz"
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${VLCQT_ROOT}
    INSTALL_COMMAND make install
)

list(APPEND GLOBAL_THIRDPARTY_LIB_ARGS "-DVLCQT_ROOT:PATH=${VLCQT_ROOT}")

ProjectRoot/modules/MyProject.cmake看起来可能如下:

代码语言:javascript
复制
ExternalProject_Add(my_project
    DEPENDS vlcqt
    SOURCE_DIR ${CMAKE_SOURCE_DIR}/MyProject
    CMAKE_ARGS
        ${GLOBAL_THIRDPARTY_LIB_ARGS}
        -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL_PATH}/my_project
    BUILD_COMMAND make
)

最后,ProjectRoot/CMakeLists.txt应该包含以下内容:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(MyProject VERSION 0.1)

set(CMAKE_MODULE_PATH
    "${CMAKE_CURRENT_SOURCE_DIR}/modules"
    ${CMAKE_MODULE_PATH}
)

include(ExternalProject)

set_directory_properties(PROPERTIES EP_BASE ${CMAKE_BINARY_DIR}/ExtProjects)
get_directory_property(EXT_BASE_PATH EP_BASE)

set(EXT_INSTALL_PATH ${EXT_BASE_PATH}/Install)

include(ExternalVLCQt)
include(MyProject)

install(DIRECTORY ${EXT_INSTALL_PATH}/my_project DESTINATION .)

您可以阅读有关此模式这里的更多信息。按照这种模式,ProjectRoot/MyProject/CMakeLists.txt将在构建vlcqt之后,在顶级CMakeLists.txt的构建时进行配置。因此,find_package将找到VLCQt包。

注意:在我的示例中,将被使用find_package命令的CMakeLists.txt of MyProject接收到。这个变量是find_package命令的提示,对于不同的包,这可能会有所不同。CMake使用的每个find_package模块都有自己的可变需求。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44990964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档