как выполнить cmake :: find_package только на этапе сборки

Я пытаюсь включить проект cmake на основе библиотеки vlc-qt, как внешний проект из репозитория github.

В проекте используется рекомендуемый способ:

FIND_PACKAGE(VLCQt REQUIRED COMPONENTS Widgets)

cmake выполняет эту команду на этапе настройки, так что вы видите, что библиотека в этот момент не собирается.

Как правильно избежать этого?

2

Решение

Поместите свой собственный проект и VLCQt проект во внешних проектах с ExternalProject_Add и создать на высшем уровне CMakeLists.txt файл, чтобы построить их один за другим.

Ваша структура каталогов будет выглядеть примерно так:

ProjectRoot/
|-- CMakeLists.txt
|-- MyProject/
|   |-- sources/
|   `-- CMakeLists.txt
`-- modules/
|-- MyProject.cmake
`-- ExternalVLCQt.cmake

ProjectRoot/modules/ExternalVLCQt.cmake может выглядеть так:

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 может выглядеть так:

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 должен содержать следующее:

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 будет настроен во время сборки верхнего уровня CMakeLists.txt после vlcqt построено. Следовательно find_package найдет VLCQt пакет.

Замечания: В моем примере VLCQT_ROOT будет получен CMakeLists.txt из MyProject где find_package команда используется. Эта переменная является подсказкой для find_package Команда и для разных пакетов это может отличаться. Каждый модуль CMake, используемый find_package имеет свои жизнеспособные требования.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]