Makefiles são comumente usados para projetos em C e derivados porque automatizam a compilação de vários arquivos .c e .h. Sem um Makefile, seria necessário escrever comandos extensos para compilar cada arquivo, algo que se torna cada vez mais trabalhoso à medida que o projeto cresce, exigindo muitas flags de compilação e outras configurações.

No entanto, antes de tudo, o Makefile serve para automatizar tarefas repetitivas. Recentemente, estava trabalhando em um projeto com Docker e percebi o quão chato é escrever comandos Docker, como subir containers, executar comandos dentro deles e rodar testes manualmente.

Felizmente, isso pode ser resolvido com um Makefile simples.

Exemplo de Makefile para gerenciar um projeto Docker:

1
.PHONY: up composer test bash help
2
3
APP_CONTAINER=my-service-container
4
5
up:
6
docker compose up -d
7
8
composer:
9
docker compose exec $(APP_CONTAINER) composer $(filter-out $@,$(MAKECMDGOALS))
10
11
test:
12
docker compose exec $(APP_CONTAINER) composer run test
13
14
bash:
15
docker compose exec $(APP_CONTAINER) bash
16
17
help:
18
@echo "Comandos disponíveis:"
19
@echo " make up - Sobe os containers"
20
@echo " make composer - Executa comandos do Composer dentro do container"
21
@echo " make test - Executa os testes do projeto"
22
@echo " make bash - Abre um terminal no container"
23
@echo " make help - Exibe esta ajuda"

Cada comando tem uma função específica:

  • .PHONY: Garante que os alvos sejam sempre executados, mesmo que existam arquivos com o mesmo nome.
  • APP_CONTAINER=my-service-container: Define o nome do container onde os comandos serão executados.
  • up: Sobe os containers definidos no docker-compose.yml em modo detached (-d).
  • composer: Facilita a execução de comandos do Composer dentro do container.
  • test: Executa os testes do projeto chamando o Composer dentro do container.
  • bash: Abre um terminal dentro do container.
  • help: Exibe uma lista de comandos disponíveis.

Após criar esse Makefile na raiz do seu projeto, basta executar os seguintes comandos:

Terminal window
1
make up # Sobe os containers
2
make composer install # Executa 'composer install' dentro do container
3
make test # Executa os testes
4
make bash # Abre um terminal no container
5
make help # Exibe os comandos disponíveis

Dessa forma, evitamos escrever comandos longos e repetitivos, tornando o desenvolvimento mais ágil e padronizado.

Além da praticidade, o uso do Makefile traz benefícios como:

  1. Facilidade e agilidade: Reduz a necessidade de digitar comandos extensos.
  2. Padronização: Toda a equipe utiliza os mesmos comandos.
  3. Automação: Permite adicionar novas tarefas facilmente, como limpeza de containers.
  4. Simplicidade: make é nativo em sistemas Unix e pode ser instalado no Windows sem dificuldades.

Bom, usando Makefiles há um mundo de funcionalidades possíveis para adicionar ao seu projeto.