CMake 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?

Выход из cmake --graphviz=graph.dot

введите описание изображения здесь

3

Решение

Итак, обновленная версия CMake предупредила меня о том, что зависимость от фреймворка отсутствует. ExternalProject_Add и add_dependencies нельзя использовать друг с другом, поскольку ExternalProject_Add фактически не построил и поэтому зарегистрировал структуру как цель высокого уровня.

Замечания:
Любой, кто столкнется с этой проблемой в будущем. Я нашел другой ТАК сообщение @matiu, который решил мою проблему.

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 параллельная сборка всегда будет неудачной из-за отсутствия зависимости.

-1

По вопросам рекламы [email protected]