мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| soft:make [2025/03/17 16:45] – создано radi0dev | soft:make [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== make ====== | ||
| + | |||
| - | Нужно для: [[cmake]] | ||
| (https:// | (https:// | ||
| - | ___ | ||
| - | NTB: Сборка = компиляция + линковка. | + | NTB: //Сборка// = //компиляция// + //линковка// |
| - | Если запустить | + | Если запустить |
| + | |||
| + | Работу '' | ||
| + | |||
| + | ===== Синтаксис Makefile ===== | ||
| + | |||
| + | ==== Общая структура ==== | ||
| - | Работу `make` можно представить себе так: | ||
| - | ``` | ||
| - | {Из чего делаем? | ||
| - | ``` | ||
| - | ## Общая структура | ||
| MakeFile состоит из набора правил, | MakeFile состоит из набора правил, | ||
| - | 1) целями (то, что данное правило делает); | + | * целями (то, что данное правило делает); |
| - | 2) реквизитами (то, что необходимо для выполнения правила и получения целей); | + | |
| - | 3) командами (выполняющими данные преобразования). | + | |
| - | В общем виде синтаксис makefile можно представить так: | + | |
| - | ``` | + | В общем виде синтаксис makefile можно представить так: |
| + | < | ||
| # Индентация осуществляется исключительно при помощи символов табуляции, | # Индентация осуществляется исключительно при помощи символов табуляции, | ||
| # каждой команде должен предшествовать отступ | # каждой команде должен предшествовать отступ | ||
| Строка 26: | Строка 28: | ||
| ... | ... | ||
| < | < | ||
| - | ``` | + | </ |
| + | |||
| + | ==== Инкрементная компиляция ==== | ||
| - | ___ | ||
| - | ## Инкрементная компиляция | ||
| Если файлов в проекте много, при каждой сборке весь проект компилируется полностью, | Если файлов в проекте много, при каждой сборке весь проект компилируется полностью, | ||
| Теперь, | Теперь, | ||
| - | ```makefile | + | < |
| main.o: main.c | main.o: main.c | ||
| gcc -c -o main.o main.c | gcc -c -o main.o main.c | ||
| Строка 41: | Строка 43: | ||
| hello: main.o hello.o | hello: main.o hello.o | ||
| gcc -o hello main.o hello.o | gcc -o hello main.o hello.o | ||
| - | ``` | + | </ |
| - | При первом запуске | + | |
| + | При первом запуске | ||
| + | |||
| + | ==== Фиктивные цели ==== | ||
| + | |||
| + | " | ||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| - | ___ | ||
| - | ## Фиктивные цели | ||
| - | " | ||
| - | - `all` — является стандартной целью по умолчанию. При вызове `make` ее можно явно не указывать. | ||
| - | - `clean` — очистить каталог от всех файлов полученных в результате компиляции. | ||
| - | - `install` — произвести инсталляцию | ||
| - | - `uninstall` — и деинсталляцию соответственно. | ||
| Для того чтобы make не искал файлы с такими именами, | Для того чтобы make не искал файлы с такими именами, | ||
| - | ```makefile | + | < |
| .PHONY: all clean install uninstall | .PHONY: all clean install uninstall | ||
| Строка 69: | Строка 73: | ||
| uninstall: # деинсталяция | uninstall: # деинсталяция | ||
| rm -rf / | rm -rf / | ||
| - | ``` | + | </ |
| - | ВАЖНО: | + | |
| + | ВАЖНО: | ||
| + | |||
| + | ==== Использование переменных и комментариев ==== | ||
| - | ___ | ||
| - | ## Использование переменных и комментариев | ||
| Переменные - удобный способ учесть возможность того, что проект будут собирать другим компилятором или с другими опциями. | Переменные - удобный способ учесть возможность того, что проект будут собирать другим компилятором или с другими опциями. | ||
| - | ```makefile | + | < |
| CC=g++ # Это комментарий, | CC=g++ # Это комментарий, | ||
| CFLAGS=-c -Wall # Это еще один комментарий. Он поясняет, | CFLAGS=-c -Wall # Это еще один комментарий. Он поясняет, | ||
| Строка 84: | Строка 89: | ||
| main.o: main.cpp | main.o: main.cpp | ||
| $(CC) $(CFLAGS) main.cpp | $(CC) $(CFLAGS) main.cpp | ||
| - | ``` | + | </ |
| По умолчанию make станет выполнять самое первое правило, | По умолчанию make станет выполнять самое первое правило, | ||
| - | ```shell | + | <code bash> |
| $ make < | $ make < | ||
| - | ``` | + | </ |
| - | ## Автоматические переменные | + | |
| - | - `$@` Имя цели обрабатываемого правила | + | ==== Автоматические переменные |
| - | - `$<` Имя первой зависимости обрабатываемого правила | + | * '' |
| - | - `$^` Список всех зависимостей обрабатываемого правила | + | * '' |
| + | * '' | ||
| + | |||
| + | подробнее [[https:// | ||
| + | |||
| + | ===== Примеры ===== | ||
| + | |||
| + | ==== Демонстрация удобства использования MakeFile ==== | ||
| - | подробнее [тут](https:// | ||
| - | ___ | ||
| - | ## Примеры (разработка) | ||
| - | #### Демонстрация удобства использования MakeFile | ||
| Пример компиляции руками: | Пример компиляции руками: | ||
| - | ```shell | + | <code bash> |
| # main.cpp - главный файл | # main.cpp - главный файл | ||
| # functions.h - прототипы всех ф-ий | # functions.h - прототипы всех ф-ий | ||
| Строка 105: | Строка 114: | ||
| # hello.cpp - | # hello.cpp - | ||
| g++ main.cpp hello.cpp factorial.cpp -o prog | g++ main.cpp hello.cpp factorial.cpp -o prog | ||
| - | ``` | + | </ |
| Долго каждый раз писать. Да и при разрастании проекта можно запутаться. Автоматизируем. Для нашего примера мейкфайл будет выглядеть так: | Долго каждый раз писать. Да и при разрастании проекта можно запутаться. Автоматизируем. Для нашего примера мейкфайл будет выглядеть так: | ||
| - | ```makefile | + | < |
| all: | all: | ||
| g++ main.cpp hello.cpp factorial.cpp -o hello | g++ main.cpp hello.cpp factorial.cpp -o hello | ||
| - | ``` | + | </ |
| Использовать несколько целей в одном мейкфайле полезно для больших проектов. Это связано с тем, что при изменении одного файла не понадобится пересобирать весь проект, | Использовать несколько целей в одном мейкфайле полезно для больших проектов. Это связано с тем, что при изменении одного файла не понадобится пересобирать весь проект, | ||
| - | ```makefile | + | < |
| all: hello | all: hello | ||
| Строка 126: | Строка 137: | ||
| clean: | clean: | ||
| rm -rf *.o hello | rm -rf *.o hello | ||
| - | ``` | + | </ |
| - | Теперь у цели `all` есть только зависимость, | + | |
| - | Еще добавилась новая цель `clean`. Она традиционно используется для быстрой очистки всех результатов сборки проекта. Очистка запускается так: `make -f Makefile-2 clean` | + | |
| - | #### Универсальный MakeFile | + | Теперь у цели '' |
| - | ```makefile | + | |
| + | Еще добавилась новая цель '' | ||
| + | |||
| + | ==== Универсальный MakeFile | ||
| + | |||
| + | < | ||
| CC=g++ | CC=g++ | ||
| CFLAGS=-c -Wall | CFLAGS=-c -Wall | ||
| Строка 146: | Строка 160: | ||
| .cpp.o: | .cpp.o: | ||
| $(CC) $(CFLAGS) $< -o $@ | $(CC) $(CFLAGS) $< -o $@ | ||
| - | ``` | + | </ |
| - | ___ | + | ==== Удобство для |
| - | + | ||
| - | ## Примеры (использование) | + | |
| установка при помощи исходников (любые, | установка при помощи исходников (любые, | ||
| - | 1) Получаем код: | + | |
| + | '' | ||
| можно клонировать репозиторий: | можно клонировать репозиторий: | ||
| - | ```shell | + | <code bash> |
| git clone hello | git clone hello | ||
| cd hello | cd hello | ||
| - | ``` | + | </ |
| ИЛИ используем тарболл: | ИЛИ используем тарболл: | ||
| - | ```shell | + | <code bash> |
| tar -xf hello-1.0.tar.xz | tar -xf hello-1.0.tar.xz | ||
| - | ``` | + | </ |
| + | |||
| + | '' | ||
| - | 2) Сборка: | ||
| если хотим использовать голый make: | если хотим использовать голый make: | ||
| - | ```shell | + | <code bash> |
| make PREFIX=/ | make PREFIX=/ | ||
| - | ``` | + | </ |
| если используем autotools: | если используем autotools: | ||
| - | ```shell | + | <code bash> |
| ./configure --prefix=/ | ./configure --prefix=/ | ||
| make | make | ||
| - | ``` | + | </ |
| если используем cmake: | если используем cmake: | ||
| - | ```shell | + | <code bash> |
| cmake -DCMAKE_INSTALL_PREFIX=/ | cmake -DCMAKE_INSTALL_PREFIX=/ | ||
| make | make | ||
| - | ``` | + | </ |
| Откуда точка в конце? Дело в том, что cmake' | Откуда точка в конце? Дело в том, что cmake' | ||
| - | 3) Установка: | + | '' |
| Используя make: | Используя make: | ||
| - | ```shell | + | <code bash> |
| make PREFIX=/ | make PREFIX=/ | ||
| - | ``` | + | </ |
| Используя autotools или cmake: | Используя autotools или cmake: | ||
| - | ```shell | + | <code bash> |
| make install | make install | ||
| - | ``` | + | </ |
| Cборка всегда осуществляется с обычными правами, | Cборка всегда осуществляется с обычными правами, | ||