【问题标题】:How to download and compile external library only once with CMake?如何使用 CMake 只下载和编译一次外部库?
【发布时间】:2020-12-05 23:05:40
【问题描述】:

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

我曾尝试使用 FetchContent、ExternalProject 和 add_subdirectory,但它们似乎都不能正常工作。

我目前面临的问题是:

  • 该库安装在我的 build/ 目录的 _deps/ 子目录中。我希望将其下载到项目根目录中名为 external/ 的目录中。
  • “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,但它似乎并没有完成我想做的所有事情。任何帮助表示赞赏。

【问题讨论】:

  • 您的所有 3 个问题实际上都不相关,应该作为单独的问题帖子提出。如需使用 FetchContent 设置下载目录,请参阅that questionFetchContent 允许与主项目一起构建子项目。如果您只想为主项目的多个配置构建一次子项目,请改用ExternalProject。另请注意,FetchContent_MakeAvailable 完成了以下 5 行中的所有操作,因此不需要它们。
  • @Tsyvarev 有帮助,谢谢。

标签: c++ c unit-testing cmake build


【解决方案1】:

我能够使用 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}

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 2021-09-30
    • 2011-03-30
    • 1970-01-01
    • 2021-12-25
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多