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:

.PHONY: up composer test bash help
APP_CONTAINER=my-service-container
up:
docker compose up -d
composer:
docker compose exec $(APP_CONTAINER) composer $(filter-out $@,$(MAKECMDGOALS))
test:
docker compose exec $(APP_CONTAINER) composer run test
bash:
docker compose exec $(APP_CONTAINER) bash
help:
@echo "Comandos disponíveis:"
@echo " make up - Sobe os containers"
@echo " make composer - Executa comandos do Composer dentro do container"
@echo " make test - Executa os testes do projeto"
@echo " make bash - Abre um terminal no container"
@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
make up # Sobe os containers
make composer install # Executa 'composer install' dentro do container
make test # Executa os testes
make bash # Abre um terminal no container
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.