Как ускорить создание образов докеров проекта c ++ с внешними библиотеками c ++? - PullRequest
0 голосов
/ 11 апреля 2019

Упрощенная структура проекта:

orka_engine
├── orka_engine_preprocessing
│   ├── CMakeLists.txt
│   └── src
│       └── main.cc
├── super_build
│    └── CMakeList.txt
└── lib
     └── // external checked out libs

с super_build/CMakeList.txt перечислением каждой внешней библиотеки и каждого подкаталога в проекте как внешнего проекта с жестко заданным путем к нему.

Прямо сейчас способ построить проект -

mkdir build
cd build
cmake ../super_build
make

и это прекрасно работает.

Проблемы начинаются, когда я пытаюсь докеризировать этот проект. cmake для super_build отказывается работать без исходного кода, и это приводит к перекомпиляции внешних библиотек при каждом обновлении исходного кода.

Соответствующие строки из Dockerfile

COPY ./orka_engine ./orka_engine

RUN mkdir ${BUILD_DIR} && \
    cd ${BUILD_DIR} && \
    cmake ../orka_engine/${CMAKE_TARGET} && \
    make -j 5

Я бы хотел собрать внешние библиотеки перед копированием в исходный код проекта, чтобы сократить время сборки докера после первого.

Я достаточно открыт, как этого добиться.

1 Ответ

0 голосов
/ 12 апреля 2019

в этом случае в вашем super_build cmake запустите другой файл CMakeLists.txt, содержащий ваш внешний проект, для сборки во время настройки.

SuperBuild CMakeLists.txt

project(SuperBuild LANGUAGES NONE)

message(STATUS "Building: DEP_A...")

# Download, build, install DEP_A at configure time
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/dep-a.CMakeLists.txt
    ${CMAKE_BINARY_DIR}/dep-a/CMakeLists.txt)

execute_process(COMMAND ${CMAKE_COMMAND} -H. -Bproject_build -G "${CMAKE_GENERATOR}"
  RESULT_VARIABLE result
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dep-a)
if(result)
  message(FATAL_ERROR "CMake step for dep-a failed: ${result}")
endif()

execute_process(COMMAND ${CMAKE_COMMAND} --build project_build --config ${CMAKE_BUILD_TYPE}
  RESULT_VARIABLE result
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dep-a)
if(result)
  message(FATAL_ERROR "Build step for dep-a failed: ${result}")
endif()

и dep-a.CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(dep-a-submodule NONE)

include(ExternalProject)

ExternalProject_Add(dep-a_project
  TMP_DIR "${CMAKE_BINARY_DIR}/dep-a/tmp"
  STAMP_DIR "${CMAKE_BINARY_DIR}/dep-a/stamp"
  DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/dep-a/download"
  SOURCE_DIR "${CMAKE_BINARY_DIR}/dep-a/source"
  BINARY_DIR "${CMAKE_BINARY_DIR}/dep-a/build"

  GIT_REPOSITORY https://github.com/dep-a/dep-a
  GIT_TAG "master"

  # UPDATE_COMMAND ""
  # PATCH_COMMAND git apply "${CMAKE_SOURCE_DIR}/patches/dep-a.patch"
  # CONFIGURE_COMMAND ""
  CMAKE_ARGS
    -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/dependencies
    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
    -DBUILD_TESTING=OFF
  # BUILD_COMMAND ""
  # INSTALL_COMMAND ""
  TEST_COMMAND ""
)

взгляните на https://github.com/Mizux/cmake-abseil/blob/install/README.md

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...