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
