Petroglif

Инструментарий

В этой главе рассмотрены инструментальные средства разработки и сборки системы.

Языки программирования

Подавляющая часть проекта реализована на языке c++.

Стандарт языка c++

В проекте применяется подмножество языка c++, соответствующее стандарту ISO/IEC 14882:1998. Возможности, доступные в более поздних стандартах практически не используются.

Компилятор и среда разработки

Для работы собственно над ядром системы используется среда разработки Microsoft Visual Studio. В состав исходных кодов входят каталоги, содержащие файлы решений (solution) и проектов (project) для Visual Studio версий 7.10 (Visual Studio 2003), и 15.0 (Visual Studio 2017).Проект одинаково успешно компилируется в каждой из указанных версий среды.

Дистрибутивы релизов собираются на Visual Studio 2017 и Visual Studio 7.10. Основной дистрибутив релизов собирается на Visual Studio 2017. На Visual Studio 7.10 собираются дополнительные модули с суффиксом -xp, обеспечивающие работу системы на операционных системах Windows XP и Windows Server 2003. Официально, с 2021 года поддержка Windows XP и Windows Server 2003 прекращается (хотя, дистрибутивы по-прежнему содержат упомянутые модули). Начиная с начала 2023 года сборка средствами Visual Studio 7.10 прекращена. Так же полностью остановлена поддержка Windows XP и Windows Server 2003.

Опции компиляции и компоновки

Конфигурации решения (Solution Configurations)

Решение содержит 6 конфигураций для трех базовых вариантов сборки:

  • Пользовательский интерактивный модуль. Файл результата: ppw.exe.
  • Job-Server. Файл результата: ppws.exe. Запускается в виде системной службы.
  • Dll-модуль для использования внешними компонентами. Файл результата: ppwmt.dll.
  • Debug
    Конфигурация пользовательской интерактивной сборки с отладочной информацией.
    Release
    Конфигурация пользовательской интерактивной сборки в релиз-варианте.
    ServerDebug
    Конфигурация Job-Server'а с отладочной информацией.
    ServerRelease
    Конфигурация Job-Server'а в релиз-варианте.
    MtDllDebug
    Конфигурация dll-модуля для использования внешними компонентами посредством COM-интерфейсов. С отладочной информацией.
    MtDllRelease
    Конфигурация dll-модуля для использования внешними компонентами посредством COM-интерфейсов. Релиз-вариант.

    Каталоги для формирования промежуточных результатов сборки (Output и Intermediate directories)

    Головной каталог проекта обычно называется Papyrus, однако это может быть и любое иное имя, например OpenPapyrus.

    Visual Studio 2003

    $(ProjectDir)../../__TEMP__/VC70/$(ConfigurationName)/$(ProjectName)/

    Visual Studio 2017

    $(ProjectDir)../../__TEMP__/VC2017/$(PlatformShortName)/$(Configuration)/$(ProjectName)/

    Visual Studio 2019

    $(ProjectDir)../../__TEMP__/VC2019/$(PlatformShortName)/$(Configuration)/$(ProjectName)/

    Visual Studio 2022

    $(ProjectDir)../../__TEMP__/VC2022/$(PlatformShortName)/$(Configuration)/$(ProjectName)/

    Обратите внимание, в шаблоне путей для Visual Studio 2017, 2019, 2022 включены дополнительные подкаталоги для символа платформы.

    Такие шаблоны применяются ко всем проектам решения.

    Выравнивание структур данных (struct member alignment)

    Все проекты компилируются с отсутствием выравнивания структур данных (struct member alignment = 1 byte). Причиной для этого является потенциальная опасность несогласованности persistent-структур при сохранении или передачи их в потоках данных.

    При этом поля структур настоятельно рекомендуется выравнивать в ручную по границе 4 байт.Например:

    
    	// С этой структурой все в порядке: каждый элемент 
    	// занимает пространство кратное 4.
    	struct ABC {
    		int   A;
    		uint8 B[16];
    		int   C;
    	};
    	
    	// В этой структуре элемент B следует выровнять до 4-байтовой границы 
    	// фиктивным элементом (в данном случае это uint8 Reserve[3]). 
    	// К таким фиктивным элементам следует добавлять предопределенный 
    	// комментарий @alignment.
    	struct ABC2 {
    		int   A;
    		bool  B;
    		uint8 Reserve[3]; // @alignment
    		int   C;
    	};	
    

    Character Set

    Все проекты решения компилируются в режиме Unicode.

    Многопоточность

    Все проекты компилируются в многопоточном варианте.

    Run-time библиотеки

    При сборке всех модулей применяется статическая компоновка с run-time библиотеками (multithread-вариант).

    Precompiled headers

    Практически все проекты сборки используют предкомпиляцию заголовков. В роли инициирующего файла обычно выступает файл с именем aaa-pch.c(cpp) где aaa - краткая аббревиатура проекта. Например pp-pch.cpp для проекта Papyrus, slib-pch.cpp для проекта SLib, openssl-ssl-pch.cpp для одного из проектов openssl и так далее.

    Conformance mode

    Для большинства проектов решения эта опция включена. К сожалению, не все модули удается скомпилировать с этой опцией, но мы стремимся к тому, чтоб сборка в

    Conformance mode

    была повсеместной.

    Сторонние компоненты

    Мы инкорпорировали в общую инфраструктуру значительное число библиотек и компонентов сторонних разработчиков. Не все из них используются - некоторые были адаптированы с той или иной целью, но дальнейшее применение было отложено. Все инкорпорированные проекты подвергаются значительной адаптации таким образом, чтобы стать максимально унифицированными со остальными частями проекта.

    Далее перечисляются почти все компоненты, которые так или иначе были включены в общую инфраструктуру.

    asmlib of Agner Fog
    Великолепный набор ассемблерных процедур для улучшения производительности. https://www.agner.org
    zlib
    Версия 1.2.11. Библиотека сжатия данных. Король opensource-мира: очень многие библиотеки и система, как открытые, так и проприетарные, используют этот компонент. https://zlib.net
    cairo
    Версия 1.16.0. Библиотека векторной 2D-графики. https://www.cairographics.org
    pixman
    Версия 0.36.0. Низкоуровневая поддержка для cairo.
    freetype
    Версия 2.10.4 (ноябрь 2020) Библиотека для работы со шрифтами. Инкорпорирована для реализации функций пользовательского интерфейса и отчетной подсистемы. Многие opensource-компоненты зависят от этой подсистемы.
    HarfBuzz
    Версия 2.7.2 (декабрь 2020) Библиотека для рендеринга текстов. Инкорпорирована для реализации функций пользовательского интерфейса и отчетной подсистемы.
    libjpeg
    Библиотека для чтения и записи изображений в формате jpeg. Используется соответствующим образом. Кроме того, значительное число иных компонентов зависят от этой библиотеки.
    libjpeg-turbo
    Библиотека того же назначения, что и libjpeg, но декларирующая лучшую производительность за счет использования SSE-команд процессора. Инкорпорирована в экспериментальных целях. При попытке реального использования стала вызывать аварийные сбои в работе системы, из-за чего применение отключено.
    libpng
    Библиотека для чтения и записи изображений в формате png. Для этого и используется. Кроме того, обеспечивает зависимости других компонентов.
    giflib
    Библиотека для чтения и записи изображений в формате gif.
    tiff
    Версия 4.0.9. Библиотека для чтения и записи изображений в формате tiff.
    OpenJPEG
    Версия 2.3.1 (декабрь 2020) Библиотека для чтения и записи изображений в формате jpeg2000. Инкорпорирована ради обеспечения зависимостей других компонентов.
    jbig2dec
    Версия 0.19 (декабрь 2020) Компонент для декодирования формата сжатия изображений JBIG2. Включена для покрытия зависимостей других подсистем. https://jbig2dec.com
    lcms2
    Версия 2.11 (декабрь 2020) Little color management system. Компонент, реализующий трансформацию цветовых схем. Инкорпорирована ради зависимостей других подсистем. https://www.littlecms.com
    libxml
    Версия 2.9.2. Библиотека для чтения и записи данных в xml-формате. Интенсивно используется. Значительно переработана - дальнейшие заимствования не предполагаются.
    BerkeleyDB
    gSOAP
    Версия 2.8.8. Значительно переработана - дальнейшие заимствования не предполагаются.
    Scintilla
    Версия 3.7.3. Используется для редактирования текстовых файлов и вывода в окне сообщений.
    cURL
    Версия 7.73.
    libzip
    openssl
    Версия 1.1.1d. Исключительно популярная библиотека, обеспечивающая шифрование TCP/IP-соединений (TLS/SSL). Используется значительным числом компонентов системы.
    libssh2
    nginx
    Версия 1.13.4. Нетипичный вариант интеграции. Nginx - нисколько не библиотека и не предназначен для использования в таком качестве. Тем не менее, мы инкорпорировали эту систему как статическую библиотеку. Цель (не достигнутая до сих пор) - реализовать полноценных web-сервер, интегрирующий управления контентом с данными ERP/CRM.
    pcre
    Библиотека для работы с регулярными выражениями с синтаксисом perl. Интегрирована из-за зависимости от нее пакета Nginx.
    7zip
    lua
    Версия 5.3.4. В планах задействовать LUA в качестве внутреннего скриптового языка.
    libarchive
    Версия 3.5.0 (декабрь 2020)
    jansson
    Экспериментальный форк, сделанный ради сборки проекта rehex.
    capstone
    Версия 4.0.2 (git clone 2020-11-18). Экспериментальный форк, сделанный ради сборки проекта rehex.
    sqlite
    Версия 3.34.00. В отличии от большинства иных заимствованных проектов, эта библиотека пока не подвергалась рефакторингу.
    mariadb-connector-c
    abseil
    Библиотека c++ общего назначения от google.
    googletest
    icu
    imgui
    libphonenumber
    lz4
    zstd
    xapian
    protobuf

    OOO "Петроглиф"
    Copyright © 2019