[CMake] ExternalProject_Add contributing to top-level Package

Rob McDonald rob.a.mcdonald at gmail.com
Sun Apr 5 13:26:36 EDT 2015


Ok, I think I've answered my own question...

I added the following after the ExternalProject_Add command...

ExternalProject_Get_Property( ALTBUILD BINARY_DIR )
INSTALL( PROGRAMS ${BINARY_DIR}/myprogram DESTINATION . )

Rob


On Sat, Apr 4, 2015 at 12:57 PM, Rob McDonald <rob.a.mcdonald at gmail.com> wrote:
> All,
>
> I have a project that is typically compiled with CLang/LLVM.  However,
> I'm now adding a component that is preferentially built with OpenMP.
> CLang doesn't support OpenMP, so I'd like to build that component with
> GCC while still building everything else with CLang.
>
> So far, I'm approaching the problem as shown in the below
> CMakeLists.txt.  The program understands -DUSE_OPENMP, so if OpenMP
> isn't found, it will build a uni-processor version.  The user can
> optionally pass -DC_OMP_COMPILER and -DCXX_OMP_COMPILER when CMake is
> run.  Those will specify alternate OpenMP capable compilers.  The
> EP_BUILD variable prevents infinite recursion.
>
> So, in the case where the primary compiler does not support OpenMP,
> and the user specifies an alternate compiler, this will use
> ExternalProject_Add to establish a new build environment with the
> alternate compiler, and build that.  So far, so good.
>
> The problem I have is that I would like the executable built by
> ExternalProject to be added to the top-level project's package.  So,
> instead of the recursion protected INSTALL at the bottom, I want a
> roughly equivalent INSTALL command that specifically works in the
> ExternalProject case.
>
> Best,
>
> Rob
>
> #####################################
> FIND_PACKAGE( OpenMP )
>
> if(OPENMP_FOUND)
>   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} -DUSE_OPENMP")
>   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -DUSE_OPENMP")
>   set(BUILD_IT true)
> else()
>
> if( CXX_OMP_COMPILER AND NOT EP_BUILD )
>
>   INCLUDE( ExternalProject )
>
>   set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
>   INCLUDE( ExternalProject_ForceBuild )
>
>   ExternalProject_Add( ALTBUILD
>     URL ${CMAKE_CURRENT_SOURCE_DIR}
>     CMAKE_ARGS -DCMAKE_C_COMPILER=${C_OMP_COMPILER}
>         -DCMAKE_CXX_COMPILER=${CXX_OMP_COMPILER}
>         -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
>         -DEP_BUILD=TRUE
>     INSTALL_COMMAND ""
>     )
>     EP_ForceBuild( ALTBUILD )
>
>   else()
>     set(BUILD_IT true)
>   endif()
> endif()
>
> if(BUILD_IT)
>
>   ADD_EXECUTABLE( myprogram
>   main.cpp
>   )
>
>   TARGET_LINK_LIBRARIES( myprogram
>   )
>
>   if ( NOT EP_BUILD )
>     INSTALL( TARGETS myprogram RUNTIME DESTINATION . )
>   endif()
>
> endif()


More information about the CMake mailing list