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

在此处输入图像描述

4

3 回答 3

2

好的,所以 CMake 的更新版本警告我框架依赖项不存在。ExternalProject_Add 和 add_dependencies 不能相互使用,因为 ExternalProject_Add 尚未实际构建,因此将框架注册为高级目标。

注意: 将来遇到此问题的任何人。我发现 @matiu 的 另一篇SO 帖子解决了我的问题。

于 2015-07-05T10:10:02.143 回答
0

也许ExternalProject_Add_StepDependencies可以解决这个问题并在 externalproject_add 和导入的目标之间创建依赖关系?

于 2020-09-17T21:46:31.060 回答
-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图

在这种情况下,没有add_dependencies并行构建总是会失败,因为缺少依赖关系。

于 2015-07-05T10:59:42.617 回答