make — не только для C. По сути это раннер задач с зависимостями: target пересобирается, только если изменился хоть один файл, от которого он зависит. Для команд без файла-результата (test, deploy, clean) нужен .PHONY — иначе make однажды решит, что цель уже “собрана”, просто увидев файл с таким же именем в директории.

.PHONY: build test deploy clean

build: main.o utils.o
	gcc -o app $^        # $^ — все зависимости

main.o: main.c
	gcc -c $< -o $@       # $< зависимость, $@ цель

test: build
	./run_tests.sh

deploy: test
	scp app prod:/opt/app/

$@/$</$^ убирают дублирование имён файлов. deploy: test гарантирует: сначала тесты, потом бинарник на прод.

#bash #automation