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 nodocker-compose.yml
em mododetached
(-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:
make up # Sobe os containersmake composer install # Executa 'composer install' dentro do containermake test # Executa os testesmake bash # Abre um terminal no containermake 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:
- Facilidade e agilidade: Reduz a necessidade de digitar comandos extensos.
- Padronização: Toda a equipe utiliza os mesmos comandos.
- Automação: Permite adicionar novas tarefas facilmente, como limpeza de containers.
- 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.