c++ build cmake vtk external-project

c++ - CMake ExternalProject_Add() y FindPackage()



build vtk (2)

Puede forzar una compilación utilizando la función build_external_project a continuación.

Funciona al generar un proyecto de ayuda simple dentro del árbol de compilación y luego llamar a la configuración de cmake y a la construcción de cmake en el ayudante.

Personalice a voluntad para el comando ExternalProject_add real.

Tenga en cuenta que los argumentos finales se utilizan para pasar CMAKE_ARGS. Las mejoras de Furthur se dejan como un ejercicio para el lector :-)

# 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()

¿Hay una forma adecuada de encontrar una biblioteca (a través de FindPackage() ) que se construyó con ExternalProject_Add() ?

El problema es que CMake no puede encontrar la biblioteca en CMake-time porque la biblioteca externa se construye en tiempo de compilación. Sé que es posible combinar estas dos funciones de CMake cuando se construye la biblioteca y el proyecto en un superbuild, pero quiero usarlo en un proyecto normal de CMake.

De hecho, me gustaría compilar VTK 6 con ExternalProject_Add y encontrarlo con FindPackage todo dentro de mi proyecto CMake.


hay una forma de hacer esto. pero es un poco hackish básicamente se agrega un destino personalizado, que se vuelve a ejecutar cmake durante la compilación.

Tendrá que probar esto en un pequeño proyecto de prueba, para decidir si funciona para usted.

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

Esto parece funcionar bien para los proyectos makefile / eclipse makefile de mingw. vs solicitará volver a cargar todos los proyectos después de la primera construcción.