мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| soft:make [2025/03/19 19:26] – удалено - внешнее изменение (Дата неизвестна) A User Not Logged in | soft:make [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== make ====== | ||
| + | |||
| + | (https:// | ||
| + | |||
| + | |||
| + | NTB: // | ||
| + | |||
| + | Если запустить | ||
| + | |||
| + | Работу '' | ||
| + | |||
| + | ===== Синтаксис Makefile ===== | ||
| + | |||
| + | ==== Общая структура ==== | ||
| + | |||
| + | MakeFile состоит из набора правил, | ||
| + | * целями (то, что данное правило делает); | ||
| + | * реквизитами (то, что необходимо для выполнения правила и получения целей); | ||
| + | * командами (выполняющими данные преобразования). | ||
| + | |||
| + | В общем виде синтаксис makefile можно представить так: | ||
| + | < | ||
| + | # Индентация осуществляется исключительно при помощи символов табуляции, | ||
| + | # каждой команде должен предшествовать отступ | ||
| + | < | ||
| + | < | ||
| + | ... | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | ==== Инкрементная компиляция ==== | ||
| + | |||
| + | Если файлов в проекте много, при каждой сборке весь проект компилируется полностью, | ||
| + | |||
| + | Теперь, | ||
| + | |||
| + | <code makefile> | ||
| + | main.o: main.c | ||
| + | gcc -c -o main.o main.c | ||
| + | hello.o: hello.c | ||
| + | gcc -c -o hello.o hello.c | ||
| + | hello: main.o hello.o | ||
| + | gcc -o hello main.o hello.o | ||
| + | </ | ||
| + | |||
| + | При первом запуске '' | ||
| + | |||
| + | ==== Фиктивные цели ==== | ||
| + | |||
| + | " | ||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | |||
| + | Для того чтобы make не искал файлы с такими именами, | ||
| + | <code makefile> | ||
| + | .PHONY: all clean install uninstall | ||
| + | |||
| + | all: hello # сборка | ||
| + | |||
| + | clean: # очистка от файлов, | ||
| + | rm -rf hello *.o | ||
| + | main.o: main.c | ||
| + | gcc -c -o main.o main.c | ||
| + | hello.o: hello.c | ||
| + | gcc -c -o hello.o hello.c | ||
| + | hello: main.o hello.o | ||
| + | gcc -o hello main.o hello.o | ||
| + | install: # инсталяция | ||
| + | install ./hello / | ||
| + | uninstall: # деинсталяция | ||
| + | rm -rf / | ||
| + | </ | ||
| + | |||
| + | ВАЖНО: '' | ||
| + | |||
| + | ==== Использование переменных и комментариев ==== | ||
| + | |||
| + | Переменные - удобный способ учесть возможность того, что проект будут собирать другим компилятором или с другими опциями. | ||
| + | <code makefile> | ||
| + | CC=g++ # Это комментарий, | ||
| + | CFLAGS=-c -Wall # Это еще один комментарий. Он поясняет, | ||
| + | |||
| + | hello: main.o | ||
| + | $(CC) main.o -o prog | ||
| + | |||
| + | main.o: main.cpp | ||
| + | $(CC) $(CFLAGS) main.cpp | ||
| + | </ | ||
| + | |||
| + | По умолчанию make станет выполнять самое первое правило, | ||
| + | <code bash> | ||
| + | $ make < | ||
| + | </ | ||
| + | |||
| + | ==== Автоматические переменные ==== | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | подробнее [[https:// | ||
| + | |||
| + | ===== Примеры ===== | ||
| + | |||
| + | ==== Демонстрация удобства использования MakeFile ==== | ||
| + | |||
| + | Пример компиляции руками: | ||
| + | <code bash> | ||
| + | # main.cpp - главный файл | ||
| + | # functions.h - прототипы всех ф-ий | ||
| + | # factorial.cpp - инклудит functions.h и определяет реализацию тамошних ф-ий | ||
| + | # hello.cpp - | ||
| + | g++ main.cpp hello.cpp factorial.cpp -o prog | ||
| + | </ | ||
| + | |||
| + | Долго каждый раз писать. Да и при разрастании проекта можно запутаться. Автоматизируем. Для нашего примера мейкфайл будет выглядеть так: | ||
| + | <code makefile> | ||
| + | all: | ||
| + | g++ main.cpp hello.cpp factorial.cpp -o hello | ||
| + | </ | ||
| + | |||
| + | Использовать несколько целей в одном мейкфайле полезно для больших проектов. Это связано с тем, что при изменении одного файла не понадобится пересобирать весь проект, | ||
| + | <code makefile> | ||
| + | all: hello | ||
| + | |||
| + | hello: main.o factorial.o hello.o | ||
| + | g++ main.o factorial.o hello.o -o hello | ||
| + | |||
| + | main.o: main.cpp | ||
| + | g++ -c main.cppfactorial.o: | ||
| + | |||
| + | hello.o: hello.cpp | ||
| + | g++ -c hello.cpp | ||
| + | |||
| + | clean: | ||
| + | rm -rf *.o hello | ||
| + | </ | ||
| + | |||
| + | Теперь у цели '' | ||
| + | |||
| + | Еще добавилась новая цель '' | ||
| + | |||
| + | ==== Универсальный MakeFile ==== | ||
| + | |||
| + | <code makefile> | ||
| + | CC=g++ | ||
| + | CFLAGS=-c -Wall | ||
| + | LDFLAGS= | ||
| + | SOURCES=main.cpp hello.cpp factorial.cpp | ||
| + | OBJECTS=$(SOURCES: | ||
| + | EXECUTABLE=prog | ||
| + | |||
| + | all: $(SOURCES) $(EXECUTABLE) | ||
| + | |||
| + | $(EXECUTABLE): | ||
| + | $(CC) $(LDFLAGS) $(OBJECTS) -o $@ | ||
| + | |||
| + | .cpp.o: | ||
| + | $(CC) $(CFLAGS) $< -o $@ | ||
| + | </ | ||
| + | |||
| + | ==== Удобство для пользователя ==== | ||
| + | |||
| + | установка при помощи исходников (любые, | ||
| + | |||
| + | '' | ||
| + | |||
| + | можно клонировать репозиторий: | ||
| + | <code bash> | ||
| + | git clone hello | ||
| + | cd hello | ||
| + | </ | ||
| + | |||
| + | ИЛИ используем тарболл: | ||
| + | <code bash> | ||
| + | tar -xf hello-1.0.tar.xz | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
| + | если хотим использовать голый make: | ||
| + | <code bash> | ||
| + | make PREFIX=/ | ||
| + | </ | ||
| + | |||
| + | если используем autotools: | ||
| + | <code bash> | ||
| + | ./configure --prefix=/ | ||
| + | make | ||
| + | </ | ||
| + | |||
| + | если используем cmake: | ||
| + | <code bash> | ||
| + | cmake -DCMAKE_INSTALL_PREFIX=/ | ||
| + | make | ||
| + | </ | ||
| + | |||
| + | Откуда точка в конце? Дело в том, что cmake' | ||
| + | |||
| + | '' | ||
| + | |||
| + | Используя make: | ||
| + | <code bash> | ||
| + | make PREFIX=/ | ||
| + | </ | ||
| + | |||
| + | Используя autotools или cmake: | ||
| + | <code bash> | ||
| + | make install | ||
| + | </ | ||
| + | |||
| + | Cборка всегда осуществляется с обычными правами, | ||