> For the complete documentation index, see [llms.txt](https://skkv-itmo.gitbook.io/c-cpp-cookies/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://skkv-itmo.gitbook.io/c-cpp-cookies/build/build-systems/make.md).

# 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
```
