Build external library only once with CMake

前端 未结 2 1791
庸人自扰
庸人自扰 2020-12-10 05:38

My C++ projects includes the source code of a third-party library (currently as a git submodule).

This library is added to the project by our main CMakelists through

2条回答
  •  -上瘾入骨i
    2020-12-10 06:15

    As @Tsyvarev said, in your case ExternalProject_Add is better than add_subdirectory. add_subdirectory is good when you want project to be essential part of your build system because target it creates can be used in in the right-hand-side of the target_link_libraries() command while target created by ExternalProject_Add cannot.

    Here is the approach I used in one of my projects. You try to find required library and build it only if it was not found. I use INTERFACE library to turn FOO_EXTERNAL into a target acceptable by target_link_libraries().

    add_library(foo INTERFACE)
    find_package(foo ${FOO_VER})
    if(NOT foo_FOUND)
        include(ExternalProject)
        include(GNUInstallDirs)
        ExternalProject_Add(FOO_EXTERNAL
                        SOURCE_DIR "${FOO_SOURCE_DIR}"
                        BINARY_DIR "${FOO_BINARY_DIR}"
                        INSTALL_DIR "${FOO_INSTALL_DIR}"
                        CMAKE_ARGS "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}"
                                   "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
                                   "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
    
                                   "-DCMAKE_INSTALL_PREFIX=${FOO_INSTALL_DIR}"
                        )
    
        add_dependencies(foo FOO_EXTERNAL)
        set(foo_LIBRARY
                "${FOO_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}foo${CMAKE_STATIC_LIBRARY_SUFFIX}")
        set(foo_INCLUDE_DIR "${FOO_INSTALL_DIR}/include")
    endif()
    
    target_link_libraries(foo INTERFACE ${foo_LIBRARY})
    target_include_directories(foo INTERFACE ${foo_INCLUDE_DIR})
    

提交回复
热议问题