CMake ExternalProject_Add 和并行构建
CMake ExternalProject_Add and parallel builds
使用以下 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
的输出
好的,所以 CMake 的更新版本警告我框架依赖项不存在。 ExternalProject_Add 和 add_dependencies 不能相互使用,因为 ExternalProject_Add 还没有实际构建,因此将框架注册为高级目标。
注:
将来遇到此问题的任何人。我找到了@matiu 的另一个 SO post 解决了我的问题。
这是添加 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
的情况下,并行构建总是会失败,因为缺少依赖项。
也许 ExternalProject_Add_StepDependencies
可以解决这个问题并在 externalproject_add 和导入的目标之间创建依赖关系?
使用以下 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
好的,所以 CMake 的更新版本警告我框架依赖项不存在。 ExternalProject_Add 和 add_dependencies 不能相互使用,因为 ExternalProject_Add 还没有实际构建,因此将框架注册为高级目标。
注: 将来遇到此问题的任何人。我找到了@matiu 的另一个 SO post 解决了我的问题。
这是添加 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
的情况下,并行构建总是会失败,因为缺少依赖项。
也许 ExternalProject_Add_StepDependencies
可以解决这个问题并在 externalproject_add 和导入的目标之间创建依赖关系?