RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
Как собрать SQLite
Как собрать SQLite

Обзор

SQLite это исходный текст на ANSI-C. Это должно быть собрано в машинный код, прежде чем это будет полезно. Эта статья это справочник по различным способам собрать SQLite.

Эта статья не содержит постепенный рецепт для компилирования SQLite. Это было бы трудно, так как каждая ситуация отличается. Скорее эта статья описывает и иллюстрирует принципы компиляции SQLite. Типичные команды компиляции обеспечиваются как примеры с ожиданием, что разработчики приложений могут использовать эти примеры в качестве руководства по развитию их собственных процедур компиляции. Другими словами, эта статья предоставляет идеи и понимание, а не готовые решения.

1. Объединение против отдельных исходных файлов

SQLite строится из ста файлов распространения кода C через многочисленные каталоги. Внедрение SQLite это чистый ANSI-C, но многие файлы исходного кода языка C произведены или преобразованы вспомогательными программами C, AWK, SED и скриптами TCL до того, как будут включены в законченную библиотеку SQLite. Сборка необходимых программ C и преобразование и/или создание исходного кода языка C для SQLite является сложным процессом.

Кроме того SQLite также доступен как предварительно упакованный файл исходного кода объединения: sqlite3.c. Объединение это единственный файл кода ANSI-C, который осуществляет всю библиотеку SQLite. Объединение намного легче для работы. Все содержится в единственном кодовом файле, таким образом, легко добавить его в исходное дерево большой программы C или C++. Все шаги генерации кода и преобразования были уже выполнены, таким образом, нет никаких вспомогательных программ C, чтобы формировать, и никаких скриптов, чтобы выполнять. И, потому что вся библиотека содержится в единственном файле , компиляторы в состоянии сделать более передовую оптимизацию, приводящую к 5-10% повышению производительности. По этим причинам исходный файл объединения ("sqlite3.c") рекомендуется для всех приложений.

Построение SQLite непосредственно от отдельных файлов исходного кода, конечно, возможно, но это не рекомендуется. Для некоторых специализированных приложений могло бы быть необходимо изменить процесс сборки способами, которые не могут быть сделаны, используя просто предварительно построенный исходный файл объединения, загруженный с веб-сайта. Для тех ситуаций рекомендуется, чтобы настроенное объединение собиралось (как описано здесь) и использовалось. Другими словами, даже если проект требует сборки SQLite из отдельных исходных файлов, все еще рекомендуется, чтобы исходный файл объединения использовался в качестве промежуточного шага.

2. Компилирование интерфейса командной строки

Сборка интерфейса командной строки требует трех исходных файлов:

  • sqlite3.c: исходный файл объединения SQLite.
  • sqlite3.h: заголовочный файл, который сопровождает sqlite3.c и определяет интерфейсы языка C к SQLite.
  • shell.c: сама программа интерфейса командной строки. Это файл исходного кода C, который содержит определение main() и цикл, который вызывает для ввода данных пользователем и обработок, которые вводят в ядро базы данных SQLite информацию для обработки.

Все три из вышеупомянутых исходных файлов содержатся в объединении tarball доступном на странице загрузки.

Чтобы построить CLI, просто поместите эти три файла в тот же самый каталог и соберите их вместе. Используя MSVC:

cl shell.c sqlite3.c -Fesqlite3.exe

В Unix (или в Windows с cygwin или mingw+msys), как правило, команда выглядит примерно так:

gcc shell.c sqlite3.c -lpthread -ldl -lm -o sqlite3

Библиотека pthreads необходима, чтобы сделать SQLite ориентированным на многопотоковое исполнение. Но так как CLI однопоточен, мы могли бы собрать SQLite в неориентированном на многопотоковое исполнение режиме и таким образом опустить библиотеку pthreads:

gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -lm -o sqlite3

Библиотека -ldl необходима, чтобы поддержать динамическую загрузку, интерфейс sqlite3_load_extension() и функцию SQL load_extension() . Если эти особенности не требуются, то они могут быть опущены, используя выбор времени компиляции SQLITE_OMIT_LOAD_EXTENSION:

gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3

Можно было бы хотеть предоставить другие возможности времени компиляции, например:

Чтобы видеть дополнительный комментарий в списках EXPLAIN, добавьте опцию -DSQLITE_ENABLE_EXPLAIN_COMMENTS. Добавьте -DHAVE_READLINE и библиотеки -lreadline и -lncurses, чтобы получить поддержку редактирования командной строки. Можно было бы также хотеть определить некоторые параметры компиляторной оптимизации. Предварительно собранный доступный для скачивания CLI с веб-сайта SQLite использует "-Os". Здесь есть бесчисленные возможные изменения. Команда, чтобы собрать полнофункциональную оболочку, могла бы выглядеть примерно так:

gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS4 \
    -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 \
    -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
    -DHAVE_READLINE \
    shell.c sqlite3.c -ldl -lm -lreadline -lncurses -o sqlite3

Ключевой пункт: сборка CLI состоит из компилирования вместе двух файлов языка C. shell.c содержит определение точки входа и циклы ввода данных пользователем, а объединение SQLite sqlite3.c содержит полноценное внедрение библиотеки SQLite.

3. Компилирование интерфейса TCL

Интерфейс TCL для SQLite это маленький модуль, который добавляется в регулярное объединение. Результат это новый исходный файл, названный "tclsqlite3.c". Этот единственный исходный файл это все, что необходимо, чтобы произвести общую библиотеку, которая может быть загружена в стандартный tclsh или wish, используя команду TCL load или произвести автономный tclsh, который идет со встроенным SQLite. Копия tcl-объединения есть на странице загрузки как файл в TEA tarball.

Чтобы произвести TCL-загружаемую библиотеку для SQLite на Linux, следующая команда будет достаточна:

gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl

Сборка разделенных библиотек для Mac OS X и Windows не так проста, к сожалению. Для тех платформ лучше применить configure и makefile, которые включены в TEA tarball.

Чтобы произвести автономный tclsh, который статически связан с SQLite, используйте эту команду:

gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm

Уловка здесь опция -DTCLSH=1. Модуль интерфейса TCL для SQLite включает процедуру main(), которая инициализирует интерпретатор TCL и входит в цикл командной строки, когда это собрано с -DTCLSH=1. Команда выше работает в Linux и Mac OS X, хотя, возможно, стоит приспособить варианты библиотеки в зависимости от платформы и того, с какой версией TCL она будет работать.

4. Сборка объединения

Версии объединения SQLite, которые поставляются на странице загрузки, обычно достаточны для большинства пользователей. Однако, некоторые проекты могут хотеть или должны построить свои собственные объединения. Общая причина строительства своего объединения в том, чтобы использовать определенные варианты времени компиляции, чтобы настроить библиотеку SQLite. Вспомните, что объединение SQLite содержит много C-кода который произведен вспомогательными программами и скриптами. Многие варианты времени компиляции производят этот произведенный код и должны поставляться генераторам кода, прежде чем объединение будет собрано. Набор вариантов времени компиляции, которые должны быть переданы в генераторы кода, может измениться от одного выпуска SQLite к следующему, но во время написания этого документа (примерно SQLite 3.6.20, 2009-11-04) набор вариантов, которые должны быть известны генераторам кода, включает:

Чтобы построить свое объединение, сначала загрузите оригинальные отдельные исходные файлы на Unix или подобную Unix платформу разработки. Обязательно получите файлы первоисточника не "preprocessed source files". Можно получить полный набор файлов первоисточника со страницы загрузки или непосредственно с configuration management system.

Предположим, что исходное дерево SQLite сохранено в каталоге "sqlite". Запланируйте построить объединение в параллельном каталоге (например) "bld". Сначала постройте соответствующий Make-файл, выполняя скрипт configure наверху исходного дерева SQLite или делая копию одного из шаблонов Make-файлов наверху исходного дерева. Затем отредактируйте Makefile, чтобы включать желаемые варианты времени компиляции. Наконец выполните:

make sqlite3.c

Или в Windows с MSVC:

nmake /f Makefile.msc sqlite3.c

Цель make "sqlite3.c" автоматически построит регулярный исходный файл объединения "sqlite3.c", его заголовочный файл "sqlite3.h" и исходный файл объединения "tclsqlite3.c", который включает интерфейс TCL. Впоследствии, необходимые файлы могут быть скопированы в каталоги проекта и собраны согласно процедурам, обрисованным в общих чертах выше.

5. Сборка Windows DLL

Чтобы построить DLL SQLite для использования в Windows, сначала получите соответствующие соединенные файлы исходного кода sqlite3.c и sqlite3.h. Они могут быть загружены с сайта SQLite или произведены из исходных текстов, как показано выше.

С файлами исходного кода в рабочем каталоге DLL может быть произведена, используя MSVC со следующей командой:

cl sqlite3.c -link -dll -out:sqlite3.dll

Вышеупомянутой командой нужно управлять от MSVC Native Tools Command Prompt. Если у вас есть MSVC, установленный на вашей машине, у вас, вероятно, есть многократные версии этой командной строки, поскольку для сборки под x86 и x64, а возможно также для кросс-сборки для ARM. Используйте соответствующую командную строку в зависимости от желаемой DLL.

Используя компилятор MinGW, командная строка:

gcc -shared sqlite3.c -o sqlite3.dll

Обратите внимание на то, что MinGW производит только 32-битные DLL. Есть отдельный проект MinGW64, который может использоваться, чтобы произвести 64-битные DLL. По-видимому синтаксис командной строки подобен. Также обратите внимание на то, что последние версии MSVC производят DLL, которые не будут работать под WinXP и более ранними версиями Windows. Таким образом для максимальной совместимости вашего произведенной DLL рекомендуют MinGW. Хорошее эмпирическое правило это произвести 32-битные DLL с использованием MinGW и 64-битные DLL, используя MSVC.

В большинстве случаев вы захотите добавить основные команды выше с вариантами времени компиляции, подходящими для вашего запроса. Обычно используемые варианты времени компиляции включают:

  • -Os Оптимизирует для размера. Сделайте DLL как можно меньше.

  • -O2 Оптимизируют для скорости. Это сделает DLL больше, разворачивая функции inlining и циклы.

  • -DSQLITE_ENABLE_FTS4 Включает полнотекстовый поиск в SQLite.

  • -DSQLITE_ENABLE_RTREE Включает расширение R-Tree.

  • -DSQLITE_ENABLE_COLUMN_METADATA Это позволяет некоторый дополнительный API, который требуется некоторыми общими системами, включая Ruby-on-Rails.