如何使用外部c ++库加速构建c ++项目的docker镜像?

问题描述 投票:0回答:1

简化的项目结构:

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

使用super_build/CMakeList.txt将项目中的每个外部lib和每个子目录列为具有硬编码路径的外部项目。

现在,构建项目的方法是

mkdir build
cd build
cmake ../super_build
make

这很好用。

当我尝试将此项目停靠时,问题就开始了。 super_build的cmake拒绝在没有源代码的情况下运行,这导致它在每次更新源代码时重新编译外部库。

来自Dockerfile的相关行

COPY ./orka_engine ./orka_engine

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

我希望在复制项目源之前构建外部库,以便在第一个之后减少docker构建时间。

我对如何实现这一点非常开放。

docker cmake docker-compose
1个回答
0
投票

在这种情况下,在你的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

© www.soinside.com 2019 - 2024. All rights reserved.