Различия между версиями 7 и 8
Версия 7 от 2020-10-05 16:01:47
Размер: 4678
Редактор: FrBrGeorge
Комментарий:
Версия 8 от 2020-10-05 19:43:30
Размер: 6064
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 64: Строка 64:
 1.#0 Прочитать и (по возможности) прощёлкать [[http://grep.cs.msu.ru/BESTA/ruprog/make.doc.txt|учебник по Make]] (про интеграцию с SCCS можно не читать). Есть ли отличия в поведении от GNU Make?
 1. '''TODO''' Д/З на Makefile и многофайловый проект
 1.#0 Прочитать и прощёлкать
  * [[FrBrGeorge/MakefileExample|Пример применения make]]
  * по возможности [[http://grep.cs.msu.ru/BESTA/ruprog/make.doc.txt|учебник по Make]] (про интеграцию с SCCS можно не читать). Есть ли отличия в поведении от GNU Make?
 1. В репозитории с Д/З сделать (вложенный) подкаталог `04_Multifile`
  * Поместить туда код из [[FrBrGeorge/MakefileExample|Пример применения make]] и убедиться, что он работает. Исправить ошибки, если они есть)
  * Доделать `Makefile` так, чтобы
   1. Собирались ''две''библиотеки: `liboutput_static.a` и `liboutput.so` из файлов `fun.o` и `const.o`
   1. Собиралось ''три'' бинарника: `prog` (из `.o`-фйалов), `prog-a` (из `prog.o` и `liboutput_static.a`) и `prog-so` (из `prog.o` и `liboutput.so`)
   1. Имелась цель `test:`, для достижения которой каждый из трёх бинарников запускается без параметров (обратите внимание на перенаправление `stderr`), с одним каким-нибудь параметром и с тремя параметрами (для каждого бинарника параметры одинаковые). Затем ''выводы'' соответствующих запусков сравниваются (например, с помощью `cmp file1 file2`)
   1. И чтобы все генераты удалались!

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

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

  • .dircolors; grep; man; PS1

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

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

  • велосипедный парк
  • ???

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

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

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

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

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

Make

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

  1. Перекомпиляция только обновлённых исходников
    • Построение графа зависимостей и подграфа пересборки
  2. Удаление генератов
    • В том числе того, что разработчик считает генератом

  3. Скриптование / code reuse приёмов сборки
    • в т. ч. уникальных для проекта

ТАБУЛЯЦИИ!

Gnu make

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

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

    • Вариант: «как создать файл определённого типа из других файлов другого определённого типа» (например .o из .c

  • Командный интерпретатор ОС в качестве языка сценариев (как правило, shell)
    • ⇒ нужен shell под системы без shell
  • Переменные
    • Специальные переменные
    • Подстановка
    • Отложенное и немедленное присваивание
  • Много правил по умолчанию
  • … (что успеем)

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

Пример

См. FrBrGeorge/MakefileExample

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

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

Д/З

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

LecturesCMC/LinuxApplicationDevelopment2020/04_Multifile (последним исправлял пользователь FrBrGeorge 2020-10-05 19:45:19)