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

时间:2014-12-15 22:47:02

标签: sqlite cmake dependencies building

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

中的外部项目中

2 个答案:

答案 0 :(得分:3)

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

这里有两种可能性:

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

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

答案 1 :(得分:0)

基于上面的正确答案,这就是我想出的。它不是将第二个文件添加到我的存储库,而是从现有的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
)