## Глава 2: Установка и настройка Make
### Установка Make
Make обычно предустановлен на большинстве Unix-подобных систем, таких как Linux и macOS. Для пользователей Windows рекомендуется использовать среды, такие как MinGW или Cygwin, которые предоставляют необходимые инструменты и среду выполнения.
#### Установка на Ubuntu/Debian
```bash
sudo apt-get update
sudo apt-get install build-essential
```
#### Установка на macOS с помощью Homebrew
```bash
brew install make
```
#### Установка на Windows
1. **MinGW:** Скачайте и установите MinGW, добавьте путь к `make.exe` в переменную окружения PATH.
2. **Cygwin:** Установите Cygwin с пакетом `make`.
### Проверка установки
После установки Make, убедитесь, что он правильно установлен, выполнив команду:
```bash
make –version
```
Вы должны увидеть информацию о версии Make, например:
```
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
```
## Глава 3: Создание и структура Makefile
### Основные правила создания Makefile
Makefile состоит из целей, зависимостей и команд. Каждое правило имеет следующий формат:
```
цель: зависимости
команда
```
### Основные конструкции Makefile
1. **Переменные:** Позволяют задавать значения, которые могут использоваться в разных частях Makefile.
```makefile
CC = gcc
CFLAGS = -Wall -g
```
2. **Паттерны:** Обеспечивают возможность работы с группами файлов, соответствующих определенному шаблону.
```makefile
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
```
Здесь `%.o` и `%.c` – шаблоны для файла объектов и исходного кода соответственно. `$<` представляет первый зависимый файл, а `$@` – цель.
3. **Автоматические переменные:** Специальные переменные, которые автоматически заменяются Make.
– `$@` – Имя цели.
– `$<` – Имя первого зависимого файла.
– `$^` – Список всех зависимых файлов.
4. **Условные конструкции:** Позволяют задавать логические условия в Makefile.
```makefile
ifeq ($(DEBUG),1)
CFLAGS += -DDEBUG
endif
```
5. **Включение других Makefile:** Позволяет разделять Makefile на несколько файлов для повышения читабельности.
```makefile
include ./config.mk
```
### Пример сложного Makefile
```makefile
# Переменные
CC = gcc
CFLAGS = -Wall -g
LDFLAGS =
SOURCES = main.c utils.c lib.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = myapp
# Основная цель
all: $(EXECUTABLE)
# Правило сборки исполняемого файла
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@