Сборочные зависимости и адаптация к окружению

Пример к лекции

Что не умеет Make (или умеет, но сложно):

⇒ Нужен высокоуровневый инструмент, для которого Makefile ­— это генерат!

Autotools

FAQ

Картинка по autotools (без интернационализации):

Autoconf-automake-process.svg

Под капотом — адские макросы на M4 и не менее адские скрипты на sh и perl. Но если посидеть, повтыкать…

Разбор примера

Репозиторий

  1. Исходная программа

  2. Результат работы autoscan

  3. Первый configure.ac (без automake)

  4. Проверки на библиотеки и include-файлы

  5. Использование config.h

  6. Дополнительные параметры configure

  7. Использование automake

  8. «Самодельные» тесты

Дополнение: сборка out of tree (TODO перенести в пример?):

А попроще?

pkg-config — Только способ запуска gcc для .h и библиотек.

Расширения для других make-подобных инструментов.

CMake

Сайт, Учебник, документация

Пример

Meson / Ninja

Сайт, учебник, документация

Пример

Ninja

Сайт, документация

Аналог make, но

Про job server

TODO пример? А будет ли время?

В Ninja и подобных ему инструментах «нет необходимости» в планировщике, так как граф зависимостей генерируется статически

Д/З

Это задание можно выполнять с помощью Autotools, а можно — с помощью других инструментариев (CMake, Meson и т. п.)

  1. Прочитать
  2. Простая утилита для подсчёта хешей
    1. Изучить работу библиотеки librhash

      • Как вычислять хеш строки и файла
      • Как выводить хеш в шестнадцатеричном и в Base64
    2. Установить в сборочное окружение devel-версию библиотеки librhash из пакета согласно правилам вашего дистрибутива

    3. Написать программу rhasher.c, организующую простейшую командную строку (REPL).

      • Первое слово командной строки — имя алгоритма хеша.
      • Второе слово — либо имя файла, либо строка (строка начинается с «"», файл — нет)

        • Для простоты считаем, что оно не содержит пробелов, и все последующие слова игнорируются

        • Например, можно использовать strtok

      • В результате работы команды на stdout выводится соответствующий хеш этого файла или строки, причём

        • должны поддерживаться как минимум MD5, SHA1 и TTH,

        • если имя хеша начиналось с большой буквы, то в шестнадцатеричном виде,
        • а если с маленькой — то в Base64 (в примерах есть Base32).
      • Если команда не опознана или какая-то ошибка с файлом, выводить на stderr сообщение и продолжать работу

      • Интерфейсом командной строки не заморачиваться, достаточно getline

      • Конец ввода — Ctrl+D

    4. Изучить работу libreadline

      • Модифицировать rhasher так, чтобы при сборке можно было использовать и getline(), и readline в зависимости от некоторого #define

    5. Написать профиль (Makefile.am + configure.ac или аналог) для сборки проекта

      • Предусмотреть проверку наличия обеих библиотек (rhash обязательна, readline опциональна)

      • Предусмотреть принудительную сборку без readline, даже если он есть)

        • Спойлер тут, но он даже слишком сложный (ncurses какие-то), можно и попроще ☺

      • Предусмотреть простейшие тесты (как минимум, сравнение с выводом утилит sha1sum и md5sum).

        • <!> Можно попробовать сделать так, чтобы при вводе не с терминала подсказка не выводилась, но это необязательное усложнение, можно вывод readline() включить в тест

      • Как обычно, предусмотреть полное удаление генератов
    6. Создать в репозитории с домашними заданиями подкаталог 07_Environmental и поместить решение туда

Как-то так:

LecturesCMC/LinuxApplicationDevelopment2024/07_Environmental (последним исправлял пользователь FrBrGeorge 2024-11-03 22:57:41)