如何使用CMake仅下载和编译一次外部库?

问题描述

我在项目中使用Unity测试库。理想情况下,无论我拥有多少种不同的CMake配置(一个Debug和一个Release CMake配置),我都想自动从GitHub下载源代码并将其放在external /目录中,一次构建该库,并链接该库我的应用程序。

我尝试使用FetchContent,ExternalProject和add_sub目录,但似乎都无法正常工作。

我目前面临的问题是:

  • 该库安装在我的build /目录的_deps /子目录中。我希望将其下载到项目根目录中的外部目录。
  • “ cmake --build”。每次都建立库。我只想将库构建一次。
  • “ cmake --install”。安装我的应用程序和Unity库。运行此命令时,我只想安装即可安装我的应用程序。该库将在构建我的应用程序之前安装在lib /和include /中。

这是我的项目结构:

project/             <-- Project root
|-- bin/             <-- Application executable
|-- build/           <-- CMake build files
|   |-- _deps/       <-- Where Unity is built
|-- doc/             <-- Documentation from Doxygen
|-- include/         <-- Unity header files
|-- lib/             <-- Unity library file
|-- module/          <-- Application source code
|-- CMakeLists.txt   <-- CMake configuration file

这是我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)
project(Project VERSION 1.0.0)
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
add_subdirectory(module)

# Add Unity testing framework from GitHub
include(FetchContent)
FetchContent_Declare(
  unity
  GIT_REPOSITORY https://github.com/ThrowTheSwitch/Unity.git
  GIT_TAG        v2.5.1
)
FetchContent_MakeAvailable(unity)
FetchContent_GetProperties(unity)
if (NOT unity_POPULATED)
  FetchContent_Populate(unity)
  add_subdirectory(${unity_SOURCE_DIR} ${unity_BINARY_DIR})
endif()

enable_testing()
add_subdirectory(tests)

我真的不知道如何实现这一目标。我看了一下other questionthis link,但似乎并没有完成我想做的所有事情。任何帮助表示赞赏。

解决方法

我能够使用ExternalProject使其工作。这是我的CMakeLists.txt现在的样子:

include(ExternalProject)
set(UNITY unity_project)
ExternalProject_Add(
    unity_project
    GIT_REPOSITORY https://github.com/ThrowTheSwitch/Unity.git
    GIT_TAG cf949f45ca6d172a177b00da21310607b97bc7a7
    PREFIX ${PROJECT_SOURCE_DIR}/external/${UNITY}
    CONFIGURE_COMMAND cmake ../${UNITY}
    BUILD_COMMAND cmake --build .
    INSTALL_COMMAND cmake --install . --prefix ${PROJECT_SOURCE_DIR}
    UPDATE_COMMAND ""
)
add_library(unity STATIC IMPORTED)
set_property(TARGET unity PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libunity.a)
add_dependencies(unity unity_project)

第一个问题由以下行解决:

PREFIX ${PROJECT_SOURCE_DIR}/external/${UNITY}

第二行通过以下行解决:

UPDATE_COMMAND ""

第三个问题由以下行解决:

INSTALL_COMMAND cmake --install . --prefix ${PROJECT_SOURCE_DIR}