⇤ ← Версия 1 от 2022-10-01 23:35:18
6972
Комментарий:
|
8151
|
Удаления помечены так. | Добавления помечены так. |
Строка 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
- (есть пакет в ALT)
zsh/bash: раскраска командной строки, алиасы
велосипедный парк ~/bin
что ещё?
Сборка из нескольких файлов
- Зачем много файлов?
- Быстрее компилировать не все
- Проще ориентироваться
- Си: пространства имён!
- Скомпилировать сразу все файлы?
- (пере)компиляция только изменённых
Компиляция до .o
(повтор: сложность компоновки вручную с помощью ld)
Make
Проблемы многофайловой сборки: вручную муторно, сценарий делает много лишнего
- Перекомпиляция только обновлённых исходников
- Построение графа зависимостей и подграфа пересборки
- Пример:
- Проект:
- Исходники — файлы на Си
- Из них компилируются объектники
- Из некоторых объектников собираются библиотеки
- Из некоторых объектников и библиотек собираются бинарники
Мы изменили один файл на си
- Что нуждается в пересборке?
- Проект:
- Удаление мусора и генератов
В том числе того, что разработчик считает генератом
- В примере выше:
- Бинарники, библиотеки и объектники — это генраты
- Однако иногда бинарники и библиотеки удалять не надо!
- Скриптование / code reuse / общая настройка приёмов сборки
- в т. ч. уникальных для проекта
- Например, все бинарники надо собирать с такими-то библиотеками, при компиляции испольозвать такие-то ключи и т. п.
ТАБУЛЯЦИИ!
Gnu make
(есть много, но этот популярнее всех остальных, вместе взятых)
- Цели и рецепты
«Как создать некий файл из других файлов» (например, prog.o из prog.c)
«некий файл» — цель (target, $@)
«другие файлы» — исходники (prerequisites, $^)
- «как создать» — рецепт (recipe, список команд, выделенных табуляцией)
Вариант с шаблоном: «как создать файл определённого типа из других файлов другого определённого типа» (например .o из .c)
- Командный интерпретатор ОС в качестве языка сценариев (как правило, shell)
- ⇒ недостаток: нужен shell под системы, в которых его нет (Windows)
- Переменные
- Специальные переменные
Подстановка / подстановка с заменой $(foo:.o=.c) / ... (ещё куча всякого $( … ))
Отложенная (=) и немедленная (::= или :=, это одно и то же) подстановка (например, в присваивании) (тут)
Много правил по умолчанию, make -p
- условные операторы / функции
- … чёрт в ступе …
- … и не только …
Литература по GNU Make
Очень старый учебник по старому Make (зато подробный и с объяснениями)
Managing Projects with GNU Make, 3rd Edition (гуглится☺)
Книга Владимира Игнатова Эффективное использование GNU Make
Пример
См. FrBrGeorge/MakefileExample
Другие низкоуровневые системы сборки
Ориентированные на ЯП и особенности сред программирования Apache_Ant/Apache_Maven (Java), Cabal (Haskell), ASDF (Lisp/CLisp), Boost.Build…
∃ Более высокий уровень — инструменты генерации сборочных сценариев (+окружение, +варианты сборки, +параметризация, +…), об этом после
Д/З
- Прочитать и прощёлкать
по возможности учебник по Make (про интеграцию с античной системой контроля версий SCCS лучше не читать☺). Есть ли отличия в поведении от GNU Make?
В репозитории с Д/З сделать (вложенный) подкаталог 03_Multifile и поместить туда код из Пример применения make
- Убедиться, что он работает. Исправить ошибки, если они есть)
Доделать Makefile так, чтобы
Собирались две библиотеки: liboutput_static.a и liboutput.so из файлов fun.o и const.o
Собиралось три бинарника: prog (из .o-фйалов), prog-a (из prog.o и liboutput_static.a) и prog-so (из prog.o и liboutput.so)
Имелась цель test:, для достижения которой
- каждый из трёх бинарников запускается
без параметров (обратите внимание на перенаправление stderr),
- с одним каким-нибудь параметром
- и с тремя параметрами (для каждого бинарника параметры одинаковые).
Затем выводы соответствующих запусков сравниваются (например, с помощью cmp file1 file2)
- каждый из трёх бинарников запускается
И чтобы все генераты удалялись по make clean!