web-dev-qa-db-fra.com

Cumake externalProject_add () et Findpackage ()

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.

29
Lars Bilke

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.

20
user1283078

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()
12
David