# Make

{% embed url="https://www.gnu.org/software/make/" %}

Утилита предназначенная для автоматизации преобразования файлов из одной формы в другую. Правила преобразования задаются в скрипте с именем Makefile, который должен находиться в корне рабочей директории проекта. Сам скрипт состоит из набора правил, которые в свою очередь описываются:

1. целями (то, что данное правило делает);
2. реквизитами (то, что необходимо для выполнения правила и получения целей);
3. командами (выполняющими данные преобразования).

В общем виде синтаксис makefile можно представить так:

```make
# Каждой команде должен предшествовать отступ
<цели>: <реквизиты>
    <команда 1>
    ...
    <команда n>
```

Простейший Makefile

```make
# Каждой команде должен предшествовать отступ
hello_make: main.c
    clang -o hello_make main.c
```

Запуск:

```powershell
> make hello_make
```

Более сложный makefile, позволяющий собрать программу, очистить рабочий каталог, используя для этого стандартные make цели. Для того чтобы make не искал файлы с такими именами, их следует определить в Makefile, при помощи директивы .PHONY. Далее показан пример Makefile с целями all, clean:

```make
TARGET = hello_make
.PHONY: all clean
all: $(TARGET)
clean:
    rm -rf $(TARGET) *.o
main.o: main.c
    gcc -c -o main.o main.c
hello.o: hello.c
    gcc -c -o hello.o hello.c
$(TARGET): main.o hello.o
    gcc -o $(TARGET) main.o hello.o
```

Запуск:

```powershell
> make  # make all
> make clean
```
