如何在 CMake 中将源文件添加到外部项目



我想使用 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
)

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

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

您在这里有两种可能性:

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

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

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

# 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
)

最新更新