【问题标题】:How to add source files to an external project in CMake?如何将源文件添加到 CMake 中的外部项目?
【发布时间】:2014-12-20 06:23:04
【问题描述】:

我想使用 ExternalProject_Add 将 SQLite 集成到我的项目中。

cmake_minimum_required(VERSION 2.8.8)
include(ExternalProject)

# Download, configure, build and install SQLite
ExternalProject_Add(SQLite
    PREFIX            ${CMAKE_SOURCE_DIR}
    TMP_DIR           ${CMAKE_SOURCE_DIR}/temp
    STAMP_DIR         ${CMAKE_SOURCE_DIR}/stamp
    #--Download step--------------
    DOWNLOAD_DIR      ${CMAKE_SOURCE_DIR}/download
    URL               http://www.sqlite.org/2014/sqlite-autoconf-3080704.tar.gz
    URL_HASH          SHA1=70ca0b8884a6b145b7f777724670566e2b4f3cde
    #--Update/Patch step----------
    UPDATE_COMMAND    ""
    #--Configure step-------------
    SOURCE_DIR        ${CMAKE_SOURCE_DIR}/source
    CONFIGURE_COMMAND "" # How to add sqlite3.c to the target here?
    #--Build step-----------------
    BINARY_DIR        ${CMAKE_SOURCE_DIR}/build
    BUILD_COMMAND     "cmake --build ."
    #--Install step---------------
    INSTALL_DIR       ${CMAKE_SOURCE_DIR}/install
)

构建命令将使用本机编译器来构建添加到目标SQLite 的所有源文件。然而,也有非。如何将唯一的源文件sqlite3.c 添加到CONFIGURE_COMMAND 内的外部项目中?

【问题讨论】:

    标签: sqlite cmake dependencies building


    【解决方案1】:

    ExternalProject_Add 假设您要引入的项目已经附带了一个(可能很复杂,可能不是基于 CMake)的工作构建系统。

    你有两种可能:

    • 您可以坚持使用您当前使用的 sqlite 的合并 autoconf 版本。在这种情况下,CONFIGURE_COMMAND 将调用configure,而BUILD_COMMAND 将调用make。请注意,此方法无法移植到未安装 autoconf 的平台。
    • 您可以切换到裸源合并版本的 sqlite 并提供您自己的CMakeLists.txt 进行构建。由于 sqlite 可以用最少的配置构建,并且合并只包含一个源文件和头文件,这并不像听起来那么难。在这种情况下,您可以简单地调用 cmake 进行配置和构建。

    但是请注意,您不能在ExternalProject_Add 内提供此信息。您将需要一个外部构建脚本,无论是 CMake、autoconf 还是其他。

    【讨论】:

    • 谢谢。如何在正常的 CMake 构建文件中下载和提取库的源代码?
    • @danijar 您仍然可以使用ExternalProject_Add 进行下载和构建。关键是您将需要一个额外的外部 CMake 文件,以供 ExternalProject_Add 调用以进行构建。
    • 那岂不是只用一个 CMakeLists.txt 手动下载源码?我认为 ExternalProject_Add 在内部也为此使用了 CMake 命令。
    • @danijar 如果你愿意,你可以这样做。问题是您将不得不手动编写下载过程脚本,而ExternalProject_Add 已经提供了足以满足大多数用途的实现。我同意这种方法缺乏一定的优雅性,但只要能完成工作,我愿意看过去。
    【解决方案2】:

    在上面的正确答案的基础上,这就是我想出的。它没有向我的存储库添加第二个文件,而是从现有的 CMake 文件生成。由于外部项目的源目录在构建时被清理,生成的文件必须存储在一个临时位置,并在外部项目的后续步骤中复制到源目录中,在本例中为更新命令。

    # SQLite
    cmake_minimum_required(VERSION 2.8.8)
    include(ExternalProject)
    
    # Add CMake project file
    file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/temp)
    file(WRITE ${CMAKE_SOURCE_DIR}/temp/CMakeLists.txt
        "cmake_minimum_required(VERSION 2.8.8)\n"
        "set(PROJECT_NAME sqlite)\n"
        "include_directories(${CMAKE_SOURCE_DIR}/source)\n"
        "add_library(sqlite3 ${CMAKE_SOURCE_DIR}/source/sqlite3.c)\n"
        "install(TARGETS sqlite3 DESTINATION lib)\n"
        "install(FILES sqlite3.h DESTINATION include)\n")
    
    # Download, configure, build and install.
    ExternalProject_Add(SQLite
        # DEPENDS
        PREFIX            ${CMAKE_SOURCE_DIR}
        TMP_DIR           ${CMAKE_SOURCE_DIR}/temp
        STAMP_DIR         ${CMAKE_SOURCE_DIR}/stamp
        #--Download step--------------
        DOWNLOAD_DIR      ${SFML_PREFIX}/download
        URL               http://www.sqlite.org/2014/sqlite-autoconf-3080704.tar.gz
        URL_HASH          SHA1=70ca0b8884a6b145b7f777724670566e2b4f3cde
        #--Update/Patch step----------
        UPDATE_COMMAND    ${CMAKE_COMMAND} -E copy
                              ${CMAKE_SOURCE_DIR}/temp/CMakeLists.txt
                              ${CMAKE_SOURCE_DIR}/source/CMakeLists.txt
        #--Configure step-------------
        SOURCE_DIR        ${CMAKE_SOURCE_DIR}/source
        CMAKE_ARGS        -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_SOURCE_DIR}/install
                          -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                          -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
        #--Build step-----------------
        BINARY_DIR        ${CMAKE_SOURCE_DIR}/build
        BUILD_COMMAND     ${CMAKE_COMMAND} --build .
        #--Install step---------------
        INSTALL_DIR       ${CMAKE_SOURCE_DIR}/install
    )
    

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多