【问题标题】:CMake ExternalProject_Add and parallel buildsCMake ExternalProject_Add 和并行构建
【发布时间】:2015-09-22 05:39:11
【问题描述】:

使用以下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 周围的 documentation?

来自cmake --graphviz=graph.dot的输出

【问题讨论】:

    标签: c++ cmake makefile parallel-builds


    【解决方案1】:

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

    注意: 以后遇到这个问题的人。我发现@matiu 的另一个SO post 解决了我的问题。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这是一个将 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})
        

        这是依赖图:

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

        【讨论】:

        • 你为什么只是重复我的帖子?这只是静态的。
        • 我刚刚分享了@98​​7654324@ 和add_dependencies 组合的工作示例。因为您的构建有时会失败,您可以比较代码并找出不同之处。在我的情况下,并行运行 cmake 不会导致任何问题。图表还显示主项目依赖于外部项目。没有add_dependencies cmake 不知道这些项目之间的依赖关系是什么,并尝试并行构建它。
        • 感谢您提供额外的静态(评论)。
        猜你喜欢
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2022-07-06
        • 2017-08-24
        相关资源
        最近更新 更多