Сборочные зависимости и адаптация к окружению
Что не умеет Make (или умеет, но сложно):
- Опциональная сборку (включать / не включать какую-то фичу)
- Поиск расположения библиотек / include-ников / утилит и т. п.
- Проверка наличия и/или работоспособности фич / библиотек
- Настройка на различные варианты сборочного инструментария
- Поддержка workflow разработки (заранее определённые действия для тестов, для документации, дисциплина хранения исходников и т. п.)
- Возможность скрытия командных строк инструментов за human-readable описаниями
- …
⇒ Нужен высокоуровневый инструмент, для которого Makefile — это генерат!
Autotools
Генерация configure — autoconf
+ autoheader (сводный .h-файл найденного)
Автоматическое конструирование Makefile.in для autoconf — automake
Автоматическая проверка зависимостей в .h-файлах — autoscan
Переопределение процедур поиска для конкретной системы — aclocal
Получение configure — autoreconf (последовательность вызова других утилит)
+ libtool для сборки библиотек и компиляции с ними
Картинка по autotools:
А попроще?
pkg-config — Только способ запуска gcc для .h и библиотек
Расширения для других make-подобных инструментов.
CMake
- Простой входной файл
- Разные back-end-ы (make, ninja, VC++-проект, XCode), ...
- Предопределённые модули для разных пакетов (вместо pkg-config и вместе с ним)
- ctest и ещё немножко workflow
- Поддержка out-of-tree сборки (есть и в autotools)
Meson / Ninja
- Простой входной файл
- Тестирование и workflow
Не поддерживает make (только ninja, msvc и xcode)
- Поддержка out-of-tree сборки (есть и в autotools)
Поддерживает модули от pkg-config, cmake и некоторые пакето-специфичные (напр. sdl-config)
TODO
Ninja
Аналог make, но
- Принципиально для генератов (например, из meson или cmake)
- Статический разбор сети зависимостей
- Отсутствие умолчаний
- Быстрый (нет условных выражений, поиска соответствий, есть дополнительные оптимизации по скорости)
Нет job server (ребята из CMake вхакивают))
Д/З
Это задание можно выполнять с помощью Autotools, а можно — с помощью других инструментариев (CMake, Meson и т. п.)
- Прочитать
(и прощёлкать) простую методичку по autotols
слайды по autotools
(заглянуть и использовать по необходимости) в Autotools Mythbuster, Autotools Tutorial, AutoBook
- (вариант — то же самое про CMake / Meson / …)
- Простая утилита для подсчёта хешей
Изучить работу библиотеки librhash
- Как вычислять хеш строки и файла
- Как выводить хеш в шестнадцатеричном и в Base64
Написать программу rhasher, организующую простейшую командную строку (REPL).
- Первое слово командной строки — имя алгоритма хеша.
Второе слово — либо имя файла, либо строка (строка начинается с «"», файл — нет)
Для простоты считаем, что оно не содержит пробелов, и все последующие слова игнорируются
Например, можно использовать strtok
В результате работы команды на stdout выводится соответствующий хеш этого файла или строки, причём
должны поддерживаться как минимум MD5, SHA1 и TTH,
- если имя хеша начиналось с большой буквы, то в шестнадцатеричном виде,
- а если с маленькой — то в Base64 (в примерах есть Base32).
Если команда не опознана или какая-то ошибка с файлом, выводить на stderr сообщение и продолжать работу
Интерфейсом командной строки не заморачиваться, достаточно getline
Конец ввода — Ctrl+D
Изучить работу libreadline
Модифицировать rhasher так, чтобы при сборке можно было использовать и getline(), и readline в зависимости от некоторого #define-а
Написать Makefile.am / configure.ac для сборки проекта
Предусмотреть проверку наличия обеих библиотек (rhash обязательна, readline опциональна)
Предусмотреть принудительную сборку без readline, даже если он есть)
Спойлер тут, но он даже слишком сложный (ncurses какие-то), можно и попроще ☺
Предусмотреть простейшие тесты (как минимум, сравнение с выводом утилит sha1sum и md5sum).
Можно попробовать сделать так, чтобы при вводе не с терминала подсказка не выводилась, но это необязательное усложнение, можно вывод readline() включить в тест
- Как обычно, предусмотреть полное удаление генератов
Создать в репозитории с домашними заданиями подкаталог 07_Environmental и поместить решение туда
Как-то так: