Многофайловая сборка

Сборка из нескольких файлов

Make

Проблемы многофайловой сборки: вручную муторно, сценарий делает много лишнего

  1. Перекомпиляция только обновлённых исходников
    • Построение графа зависимостей и подграфа пересборки
    • Пример:
      • Проект:
        • Исходники — файлы на Си
        • Из них компилируются объектники
        • Из некоторых объектников собираются библиотеки
        • Из некоторых объектников и библиотек собираются бинарники
      • Мы изменили один файл на си

        • Что нуждается в пересборке?
  2. Удаление мусора и генератов
    • В том числе того, что разработчик считает генератом

    • В примере выше:
      • Бинарники, библиотеки и объектники — это генраты
      • Однако иногда бинарники и библиотеки удалять не надо!
  3. Скриптование / code reuse / общая настройка приёмов сборки
    • в т. ч. уникальных для проекта
    • Например, все бинарники надо собирать с такими-то библиотеками, при компиляции использовать такие-то ключи и т. п.

Gnu make

ТАБУЛЯЦИИ!

(есть много, но этот популярнее всех остальных, вместе взятых)

Литература по GNU Make

Пример

См. FrBrGeorge/MakefileExample

В частности — синтаксис для работы с компонентами статической библиотеки (архива)

Другие низкоуровневые системы сборки

∃ Более высокий уровень — инструменты генерации сборочных сценариев (+окружение, +варианты сборки, +параметризация, +…), об этом после

Д/З

  1. Прочитать и прощёлкать
  2. В репозитории с Д/З сделать (вложенный) подкаталог 02_Multifile и поместить туда код из Пример применения make

    • Убедиться, что он работает. Исправить ошибки, если они есть)
    • Доделать Makefile так, чтобы в цели по умолчанию

      1. Собирались две библиотеки: liboutput_static.a и liboutput.so из файлов fun.o и const.o (одна статическая, другая — динамичесчкая)

      2. Собиралось три бинарника: prog (из .o-фйалов), prog-a (из prog.o и liboutput_static.a) и prog-so (из prog.o и liboutput.so)

      3. Имелась цель test:, для достижения которой

        • каждый из трёх бинарников запускается
          • без параметров (при запуске без параметров на stderr выводится help — обратите внимание на перенаправление и на то, что argv[0] у программ не совпадают),

            • (перенаправление обоих выходных потоков (stderr и stdout) можно делать так: ./prog > outfile 2>&1)

            • (чтобы выводы совпали, в исходном тексте разрешается вместо argv[0] использовать одинаковую константу, например, "prog")

          • с одним каким-нибудь параметром
          • и с тремя параметрами (для каждого бинарника параметры одинаковые).
        • Затем выводы соответствующих запусков сравниваются (например, с помощью cmp file1 file2, который вернёт ненулевой статус ошибки, если файлы не одинаковы)

      4. И чтобы все генераты (включая файлы с выводами из тестов) удалялись по make clean!

LecturesCMC/LinuxApplicationDevelopment2024/02_Multifile (last edited 2024-09-30 22:16:52 by FrBrGeorge)