Амальгамация и канонические исходные файлы
1. Какую кодовую базу использовать для сборки SQLite?
SQLite написана на языке C. Чтобы скомпилировать SQLite, нужно использовать компилятор C, который преобразует исходный код на C в двоичный машинный код.
Но всё не совсем так просто. В проекте SQLite различают «канонический исходный код» и «амальгамацию». Вот что разработчики SQLite подразумевают под этими терминами:
1.1. Канонические исходные файлы и амальгамация
Канонический исходный код или канонические исходные файлы → Канонический исходный код — это первоисточник SQLite. Это файлы исходного кода, которые разработчики SQLite пишут и поддерживают и которые хранятся в системе управления исходным кодом. Если вы получите копию исходного кода SQLite из репозитория Fossil (https://sqlite.org/src) или зеркала на GitHub (https://github.com/sqlite/sqlite), вы получите канонический исходный код.
-
Амальгамация → В процессе сборки SQLite файлы канонического исходного кода преобразуются и объединяются в несколько крупных файлов кода на C:
- sqlite3.c
- sqlite3.h
- shell.c
Эти файлы исходного кода — тоже код на C. Объединение множества небольших файлов кода в несколько крупных упрощает компиляцию SQLite. Кроме того, это помогает компилятору C оптимизировать код, чтобы он выполнялся быстрее.
Если вы хотите самостоятельно скомпилировать SQLite для использования в своих проектах, с чего следует начать — с канонического исходного кода или с амальгамации?
2. Общие сведения
На следующей диаграмме показан полный процесс сборки SQLite:
Полный процесс сборки начинается с файлов канонического исходного кода в левой части диаграммы. Таких отдельных канонических исходных файлов от 100 до 200 (в зависимости от версии SQLite). Некоторые из них преобразуются программами препроцессора для создания «промежуточных исходных файлов». Один из примеров препроцессора — генератор синтаксических анализаторов Lemon. Один из файлов канонического исходного кода — parse.y, содержащий грамматику LALR(1) для диалекта SQL, поддерживаемого SQLite. Lemon преобразует эту грамматику в код на C, реализующий магазинный автомат, который разбирает текст SQL и строит абстрактное синтаксическое дерево. В SQLite есть множество других программ и скриптов, преобразующих код, который редактируют разработчики SQLite, в код, понятный компиляторам C. Предварительно обрабатываются не все файлы канонического исходного кода, но довольно многие.
После предварительной обработки некоторые скрипты собирают множество промежуточных исходных файлов и оставшиеся файлы канонического исходного кода и объединяют их, создавая «амальгамацию». Часто под «амальгамацией» подразумевают только файл «sqlite3.c», содержащий основную часть исходного кода SQLite. Но соответствующий заголовочный файл «sqlite3.h» также создаётся из других файлов. Исходный код интерфейса командной строки SQLite — это амальгамация, содержащаяся в файле «shell.c».
Затем файлы амальгамации можно обработать любым обычным компилятором C, чтобы получить конечные результаты сборки, показанные в правой части диаграммы. (На диаграмме показаны имена файлов результатов сборки, которые могут использоваться в Windows. Замените их подходящими именами для вашей системы.)
3. Как скомпилировать из канонических исходных файлов
Чтобы скомпилировать SQLite из канонических исходных файлов, скачайте tar-архив или ZIP-архив дерева исходного кода, распакуйте его, а затем запустите в Unix команду «./configure && make» или в Windows — «nmake /f Makefile.msc». Подробнее см. здесь:
4. Как скомпилировать амальгамацию
При каждом выпуске SQLite разработчики предоставляют готовые файлы амальгамации SQLite, которые можно скачать со страницы загрузки. Ищите файлы с именами «sqlite-amalgamation-NNNNNNN.zip» и «sqlite-autoconf-NNNNNNN.tar.gz». Первый архив содержит только файлы исходного кода амальгамации. Второй также включает скрипт «configure» и Makefile.
5. Преимущества сборки из амальгамации
-
Меньше файлов, о которых нужно беспокоиться
Вы можете поместить нужные файлы амальгамации в собственное дерево исходного кода и скомпилировать их с помощью своего Makefile. Отдельный скрипт «configure» или Makefile вам не обязателен. Добавьте файлы «sqlite3.c» и «sqlite3.h» в своё дерево исходного кода — и они всегда будут под рукой, без появления новой зависимости. Когда понадобится обновление, просто скачайте последнюю версию и замените файлы в своём дереве исходного кода.
-
Меньше данных для загрузки
Архивы с амальгамацией занимают менее четверти размера полного дерева исходного кода SQLite. Поэтому загружать придётся меньше.
-
В любом случае вы будете использовать амальгамацию
При сборке из канонических исходных файлов Makefile сначала создаёт амальгамацию, а затем компилирует её в двоичный машинный код. Почему бы не пропустить этот первый шаг и сразу не скомпилировать амальгамацию?
-
Вы знаете, что используемая вами амальгамация прошла тестирование и проверку разработчиками SQLite
Если вы скачаете готовые файлы амальгамации, то можете быть уверены, что именно эти файлы исходного кода прошли тщательное тестирование разработчиками SQLite. Вам не придётся беспокоиться, что вы случайно что-то сломали, преобразуя канонические исходные файлы в амальгамацию.
6. Преимущества сборки из канонических исходных файлов
-
Доступ к большему числу параметров компиляции
SQLite поддерживает множество параметров компиляции: некоторые из них работают с амальгамацией, а некоторые — нет. В зависимости от того, какие параметры компиляции вы хотите использовать, может потребоваться сборка из канонических исходных файлов.
-
Доступ к историческим и ещё не выпущенным версиям SQLite
Исходный код амальгамации обычно доступен только для последней выпущенной версии SQLite. Если вам нужна историческая версия SQLite или вы хотите попробовать последнюю, ещё не выпущенную версию из ветки trunk — например, потому что в ней есть интересующая вас новая функция или потому что вы хотите внести свой вклад, помогая с тестированием до выпуска, — вам придётся скомпилировать канонический исходный код.
-
Код проще адаптировать
Если вы добавляете собственные улучшения или изменения в SQLite, вероятно, вам следует работать с каноническими исходными файлами. Амальгамация предназначена для удобства компиляторов C, а не программистов. Теоретически можно вносить изменения непосредственно в исходный код амальгамации, но работать с каноническими исходными файлами будет проще.
7. Итоги: что выбрать
Решение о том, собирать SQLite из амальгамации или из канонических исходных файлов, зависит от ваших конкретных обстоятельств. Изучите перечисленные выше преимущества и недостатки каждого подхода и решите сами.
Последнее обновление этой страницы: 2025-07-12 15:11:36Z
SQLite is in the Public Domain.
https://sqlite.org/amalg-v-canon.html