Различия между версиями 1 и 2
Версия 1 от 2022-10-01 23:35:18
Размер: 6972
Редактор: FrBrGeorge
Комментарий:
Версия 2 от 2022-10-02 00:11:37
Размер: 8151
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 2: Строка 2:

<<MiniPage(----\n'''~+Это копипаста аналогичного материала прошлых лет; возможно, её надо отредактировать+~'''----\n)>>
Строка 12: Строка 10:
 * велосипедный парк `~/.local/bin`
 * ???
 * велосипедный парк `~/bin`
 * {{attachment:FrBrGeorge/MyDict/speech_balloon_question.png}} что ещё?
Строка 30: Строка 28:
  * Пример:
   * Проект:
     * Исходники — файлы на Си
     * Из них компилируются объектники
     * Из некоторых объектников собираются библиотеки
     * Из некоторых объектников и библиотек собираются бинарники
   * Мы изменили ''один файл на си''
    * Что нуждается в пересборке?
Строка 32: Строка 38:
 1. Скриптование / code reuse приёмов сборки   * В примере выше:
   * Бинарники, библиотеки и объектники — это генраты
   * Однако иногда бинарники и библиотеки удалять не надо!
 1. Скриптование / code reuse / общая настройка приёмов сборки
Строка 34: Строка 43:
  * Например, все бинарники надо собирать с такими-то библиотеками, при компиляции испольозвать такие-то ключи и т. п.
Строка 39: Строка 49:
(есть много, но этот популярнее всех остальных, вместе взатых) (есть много, но этот популярнее всех остальных, вместе взятых)
Строка 41: Строка 51:
  * Как правило «как создать файл из других файлов» (например, `prog.o` из `prog.c`)   * «Как создать некий файл из других файлов» (например, `prog.o` из `prog.c`)
   * «некий файл» — цель (target, `$@`)
   * «другие файлы» — исходники (prerequisites, `$^`)
   * «как создать» — рецепт (recipe, список команд, выделенных табуляцией)
Строка 44: Строка 57:
  * ⇒ нужен shell под системы без shell   * ⇒ недостаток: нужен shell под системы, в которых его нет (Windows)
Строка 47: Строка 60:
  * Подстановка / подстановка с заменой `$(foo:.o=.c)` / ...
  * Отложенная и немедленная подстановка (например, в присваивании)
  * Подстановка / подстановка с заменой `$(foo:.o=.c)` / ... (ещё куча всякого `$( … )`)
  * Отложенная (`=`) и немедленная (`::=` или `:=`, это одно и то же) подстановка (например, в присваивании) ([[https://www.gnu.org/software/make/manual/make.html#Flavors|тут]])
Строка 52: Строка 65:
 * …
 * … и не только …
Строка 57: Строка 69:
 * [[https://www.oreilly.com/library/view/managing-projects-with/0596006101/|Managing Projects with GNU Make, 3rd Edition]]  * [[https://www.oreilly.com/library/view/managing-projects-with/0596006101/|Managing Projects with GNU Make, 3rd Edition]] (гуглится☺)
Строка 72: Строка 84:
  * по возможности [[http://grep.cs.msu.ru/BESTA/ruprog/make.doc.txt|учебник по Make]] (про интеграцию с SCCS можно не читать). Есть ли отличия в поведении от GNU Make?   * по возможности [[http://grep.cs.msu.ru/BESTA/ruprog/make.doc.txt|учебник по Make]] (про интеграцию с античной системой контроля версий SCCS лучше не читать). Есть ли отличия в поведении от GNU Make?
Строка 78: Строка 90:
   1. Имелась цель `test:`, для достижения которой каждый из трёх бинарников запускается без параметров (обратите внимание на перенаправление `stderr`), с одним каким-нибудь параметром и с тремя параметрами (для каждого бинарника параметры одинаковые). Затем ''выводы'' соответствующих запусков сравниваются (например, с помощью `cmp file1 file2`)
   1. И чтобы все генераты удалялись!
 1. <!> Обратите внимание на то, что нумерация лекций поменялась, просьба переименовать [[../02_TerminalProject#A.2BBBQ-.2F.2BBBc-|каталог с предыдущим домашним заданием]] в отдельно коммите!
   1. Имелась цель `test:`, для достижения которой
    *
каждый из трёх бинарников запускается       * без параметров (обратите внимание на перенаправление `stderr`),
     *
с одним каким-нибудь параметром
     *
и с тремя параметрами (для каждого бинарника параметры одинаковые).
    *
Затем ''выводы'' соответствующих запусков сравниваются (например, с помощью `cmp file1 file2`)
   1. И чтобы все генераты удалялись по `make clean`!

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

Сначала про настройку окружения

  • .dircolors; grep; man; PS1

  • vim: цветовые схемы, *~-файлы, vimbackup

  • zsh/bash: раскраска командной строки, алиасы

  • велосипедный парк ~/bin

  • FrBrGeorge/MyDict/speech_balloon_question.png что ещё?

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

  • Зачем много файлов?
    • Быстрее компилировать не все
    • Проще ориентироваться
    • Си: пространства имён!
    • (!) пример

  • Скомпилировать сразу все файлы?
  • (пере)компиляция только изменённых
    1. Компиляция до .o

    2. Компоновка

      • (повтор: сложность компоновки вручную с помощью ld)

Make

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

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

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

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

ТАБУЛЯЦИИ!

Gnu make

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

  • Цели и рецепты
    • «Как создать некий файл из других файлов» (например, prog.o из prog.c)

      • «некий файл» — цель (target, $@)

      • «другие файлы» — исходники (prerequisites, $^)

      • «как создать» — рецепт (recipe, список команд, выделенных табуляцией)
    • Вариант с шаблоном: «как создать файл определённого типа из других файлов другого определённого типа» (например .o из .c)

  • Командный интерпретатор ОС в качестве языка сценариев (как правило, shell)
    • ⇒ недостаток: нужен shell под системы, в которых его нет (Windows)
  • Переменные
    • Специальные переменные
    • Подстановка / подстановка с заменой $(foo:.o=.c) / ... (ещё куча всякого $( … ))

    • Отложенная (=) и немедленная (::= или :=, это одно и то же) подстановка (например, в присваивании) (тут)

  • Много правил по умолчанию, make -p

  • условные операторы / функции
  • … чёрт в ступе …
  • … и не только …

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

Пример

См. FrBrGeorge/MakefileExample

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

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

Д/З

  1. Прочитать и прощёлкать
  2. В репозитории с Д/З сделать (вложенный) подкаталог 03_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),

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

      4. И чтобы все генераты удалялись по make clean!

LecturesCMC/LinuxApplicationDevelopment2022/03_Multifile (последним исправлял пользователь FrBrGeorge 2022-10-04 19:37:50)