Il y a une bonne façon de trouver une bibliothèque (via FindPackage()
) qui a été construite avec ExternalProject_Add()
?
Le problème est que Clake ne trouve pas la bibliothèque au moment de la cumake, car la bibliothèque externe obtient la construction lors de la compilation. Je sais qu'il est possible de combiner ces deux fonctions CMake lors de la construction de la bibliothèque et du projet dans un superbuild, mais je veux l'utiliser dans un projet de cumake normal.
En fait, j'aimerais construire VTK 6 avec ExternalProject_Add
et le trouver avec FindPackage
tout dans mon projet CMAKE.
il y a un moyen de faire cela. Mais c'est une sorte de pirate. Vous ajoutez essentiellement une cible personnalisée, qui redevient CMAKE pendant la construction.
vous devrez essayer cela dans un petit projet de test, pour décider si cela fonctionne pour vous
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()
cela semble bien fonctionner pour les projets Mingw Makefiles/Eclipse Makefile. vs demandera de recharger tous les projets après la première construction.
Vous pouvez forcer une construction à l'aide de la fonction build_external_project la fonction ci-dessous.
Cela fonctionne en générant un simple projet d'assistant à l'intérieur de l'arborescence de construction, puis appelant la configuration de la cmake et la construction de cmake sur l'aide.
Personnalisez à volonté pour la commande externeProject_add réelle.
Notez que les arguments de fin sont utilisés pour transmettre CUKE_ARGS. FAIGNURE L'amélioration est laissée comme un exercice au lecteur :-)
# 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()