CMake ExternalProject_Add () и FindPackage ()

Есть ли правильный способ найти библиотеку (через FindPackage()) который был построен с ExternalProject_Add()?

Проблема в том, что CMake не может найти библиотеку во время CMake, потому что внешняя библиотека собирается во время компиляции. Я знаю, что можно объединить эти две функции CMake при сборке библиотеки и проекта в супербилде, но я хочу использовать его в обычном проекте CMake.

На самом деле я хотел бы построить ВТК 6 с ExternalProject_Add и найти его с FindPackage все внутри моего проекта CMake.

20

Решение

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

вам придется попробовать это в небольшом тестовом проекте, чтобы решить, работает ли он для вас

find_package(Beaengine)############################################
#
#    BeaEngine
#
include(ExternalProject)
externalproject_add(BeaEngine
SOURCE_DIR            ${PROJECT_SOURCE_DIR}/beaengine
SVN_REPOSITORY        http://beaengine.googlecode.com/svn/trunk/
CMAKE_ARGS            -DoptHAS_OPTIMIZED=TRUE -DoptHAS_SYMBOLS=FALSE -DoptBUILD_64BIT=FALSE -DoptBUILD_DLL=FALSE -DoptBUILD_LITE=FALSE
INSTALL_COMMAND       "")if(NOT ${Beaengine_FOUND})
#rerun cmake in initial build
#will update cmakecache/project files on first build
#so you may have to reload project after first build
add_custom_target(Rescan ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR} DEPENDS BeaEngine)
else()
#Rescan becomes a dummy target after first build
#this prevents cmake from rebuilding cache/projects on subsequent builds
add_custom_target(Rescan)
endif()add_executable(testapp testapp.cpp )
add_dependencies(testapp Rescan)
if(${Beaengine_FOUND})
target_link_libraries(testapp ${Beaengine_LIBRARY})
endif()

похоже, это хорошо работает для проектов Mingw Makefiles / Eclipse Makefile.
vs попросит перезагрузить все проекты после первой сборки.

18

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

Вы можете форсировать сборку используя build_external_project функция ниже.

Он работает, генерируя простой вспомогательный проект внутри дерева сборки, а затем вызывая конфигурацию cmake и сборку cmake на помощнике.

Настройте по желанию для фактической команды ExternalProject_add.

Обратите внимание, что конечные аргументы используются для передачи CMAKE_ARGS. Улучшения Furthur оставлены в качестве упражнения для читателя 🙂

# This function is used to force a build on a dependant project at cmake configuration phase.
#
function (build_external_project target prefix url) #FOLLOWING ARGUMENTS are the CMAKE_ARGS of ExternalProject_Add

set(trigger_build_dir ${CMAKE_BINARY_DIR}/force_${target})

#mktemp dir in build tree
file(MAKE_DIRECTORY ${trigger_build_dir} ${trigger_build_dir}/build)

#generate false dependency project
set(CMAKE_LIST_CONTENT "cmake_minimum_required(VERSION 2.8)

include(ExternalProject)
ExternalProject_add(${target}
PREFIX ${prefix}/${target}
URL ${url}
CMAKE_ARGS ${ARGN}
INSTALL_COMMAND \"\")

add_custom_target(trigger_${target})
add_dependencies(trigger_${target} ${target})
")

file(WRITE ${trigger_build_dir}/CMakeLists.txt "${CMAKE_LIST_CONTENT}")

execute_process(COMMAND ${CMAKE_COMMAND} ..
WORKING_DIRECTORY ${trigger_build_dir}/build
)
execute_process(COMMAND ${CMAKE_COMMAND} --build .
WORKING_DIRECTORY ${trigger_build_dir}/build
)

endfunction()
11

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