CMake ExternalProject_Add和并行构建

6

使用以下 CMakeLists.txt 构建脚本:

include( ExternalProject )
ExternalProject_Add( framework SOURCE_DIR ${framework_SOURCE}
                     PREFIX framework_build
                     INSTALL_DIR ${framework_DISTRIBUTION} )

    ...

add_library( ${PROJECT_NAME} SHARED ${BUILD_MANIFEST} )
add_dependencies( ${PROJECT_NAME} framework )

当我尝试进行并行构建(make -j5)时,由于框架中的构建工件不存在,它偶尔会失败。通过add_dependencies修复的构建顺序没有被遵守。
我是否误解了有关add_dependencies文档
来自cmake --graphviz=graph.dot的输出。

enter image description here

3个回答

2

好的,一个更新版本的CMake提示我框架依赖不存在。ExternalProject_Add和add_dependencies不能同时使用,因为ExternalProject_Add未实际构建并注册框��作为高级目标。

注意: 任何遇到此问题的人,请参考@matiu在SO post中提供的解决方法。


0
也许可以使用ExternalProject_Add_StepDependencies来解决这个问题,并在外部项目添加和导入目标之间创建依赖关系?

-1

这是一个最小化的工作示例,将Google测试添加为依赖项。

    cmake_minimum_required(VERSION 2.8)
    project(ExampleProject)

    # Set the build type if it isn't already
    if(NOT CMAKE_BUILD_TYPE)
      set(CMAKE_BUILD_TYPE Debug)
    endif()

    include(ExternalProject)

    set(GOOGLE_TEST GoogleTest)
    set(GTEST_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/${GOOGLE_TEST}")

    ExternalProject_Add(${GOOGLE_TEST}
      GIT_REPOSITORY https://chromium.googlesource.com/external/googletest 
      PREFIX ${GTEST_PREFIX}
      CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} 
      INSTALL_COMMAND ""
    )

    # Specify include directory
    ExternalProject_Get_Property(${GOOGLE_TEST} source_dir)
    include_directories(${source_dir}/include)

    set(LIBPREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}")
    set(LIBSUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}")
    set(GTEST_LOCATION "${GTEST_PREFIX}/src/${GOOGLE_TEST}-build")
    set(GTEST_LIBRARY  "${GTEST_LOCATION}/${LIBPREFIX}gtest${LIBSUFFIX}")
    set(EXECUTABLE_NAME ${CMAKE_PROJECT_NAME})

    add_executable(${EXECUTABLE_NAME} main.cpp)
    add_dependencies(${EXECUTABLE_NAME} ${GOOGLE_TEST})

    target_link_libraries(
        ${EXECUTABLE_NAME}
        ${GTEST_LIBRARY}
        -lpthread
    )

    enable_testing()
    set(TEST_NAME ${EXECUTABLE_NAME})
    add_test(${EXECUTABLE_NAME} ${TEST_NAME})

这是依赖关系图:

CMake graph

在这种情况下,如果没有使用add_dependencies,并行构建将始终失败,因为缺少依赖项。

你为什么只是重复我的帖子?这只是静态的。 - Ben Crowhurst
我刚刚分享了ExternalProject_Addadd_dependencies组合的工作示例。因为构建有时会失败,您可以比较代码并找到差异。在我的情况下,同时运行cmake不会导致任何问题。图表还显示主项目依赖于外部项目。如果没有add_dependencies,cmake不知道这些项目之间的依赖关系,并尝试并行构建它们。 - jakule
感谢您额外添加的静态(注释)。 - Ben Crowhurst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接