2014-12-15 2 views
0

Я хочу интегрировать SQLite в свой проект, используя ExternalProject_Add.Как добавить исходные файлы в внешний проект в CMake?

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?

ответ

3

ExternalProject_Add предполагает, что проект, который вы хотите вытащить, уже поставляется с (возможно сложной, возможно, не на основе CMake) рабочей системой сборки.

У вас есть две возможности:

  • Вы можете придерживаться с объединенной версии AUTOCONF из SQLite, которые вы используете. В этом случае CONFIGURE_COMMAND будет ссылаться на configure, а BUILD_COMMAND будет ссылаться на make. Обратите внимание, что этот подход не будет переносимым на платформы, на которых не установлен autoconf.
  • Вы можете переключиться на объединенную версию sqlite с открытым исходным кодом и предоставить свой собственный CMakeLists.txt для строительства. Так как sqlite может быть построен с минимальной конфигурацией, а объединение состоит только из одного источника и файла заголовка, это не так сложно, как может показаться. В этом случае вы можете просто вызвать cmake для настройки и построения.

Отметьте, однако, что вы не можете предоставить эту информацию в строке ExternalProject_Add. Вам понадобится внешний скрипт сборки, будь то CMake, autoconf или что-то еще.

+0

Спасибо. Как загрузить и извлечь источники библиотеки в обычном файле сборки CMake? – danijar

+0

@ danijar Вы можете использовать 'ExternalProject_Add' для загрузки и создания. Дело в том, что вам понадобится дополнительный внешний файл CMake для вызова 'ExternalProject_Add' для построения. – ComicSansMS

+0

Не имеет ли смысл тогда использовать только один CMakeLists.txt для ручной загрузки источника? Я думаю, что ExternalProject_Add внутренне использует для этого команду CMake. – danijar

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 
) 
Смежные вопросы