DEV Community

Erick Takeshi
Erick Takeshi

Posted on

makefile para projetos em Go

make é uma ferramenta de sistemas Unix utilizada para buildar programas desde 1976.

Embora seja muito utilizada em, e frequentemente associada a, desenvolvimento de programas em C ou C++, o make também foi a ferramenta adotada pela comunidade Go para automatizar tarefas relacionadas a projetos.

Para utilizar o make precisamos de um arquivo, que por convenção é chamado de Makefile, que contem as instruções de como buildar um determinado projeto.

Abaixo segue exemplo de um Makefile qualquer para um programa em Go:


# variaveis
GOCMD = go
GOLINT = golint

# declaracao da instrucao default
.DEFAULT_GOAL := build

# rules
fmt:
    $(GOCMD) fmt ./...
.PHONY: fmt

lint: fmt
    $(GOLINT) ./...
.PHONY: lint

vet: fmt
    $(GOCMD) vet ./...
.PHONY: vet

build: vet
    $(GOCMD) build
.PHONY:build
Enter fullscreen mode Exit fullscreen mode

Passando por cada aspecto rapidamente:
Nas primeiras linhas do arquivo vemos a declaração de algumas variáveis que serão uteis para nos ajudar a chamar o comando nas regras definidas (rules). A variável GOCMD é especialmente interessante pois podemos deixar nosso Makefile agnóstico de versões do Go, uma vez que, com o suporte built-in da linguagem, deverias ter algo como go1.15.2 quando quisermos utilizar uma versão específica.

Na linha seguinte temos a declaração do .DEFAULT_GOAL que atribui qual vai ser a regra a ser rodada quando não passarmos nenhum argumento pro executável do make, ou seja, invocando somente make no diretório do projeto vai executar a regra “build”.

Nas próximas linhas temos as declarações de regras (rules), essas regras são os nomes que damos a sequencias de instruções shell que deverão ser executadas, alem disso, temos a declaração do .PHONY, uma instrução que dita que aquela regra em específico não produz um arquivo como output.

A estrutura de uma regra é a seguinte:

nome_da_regra: dep1 dep2
    intructions
    instruction2

dep1: ...
Enter fullscreen mode Exit fullscreen mode

Um importante aspecto que precisamos nos atentar é que o make é bem “chato” quando se trata de espaçamento antes das instruções shell, precisamos sempre usar tab ante de cada instrução, não podemos usar espaços (como usamos por padrão em alguns editores de texto, é bom verificar).

OBS sobre o Makefile de exemplo

Em projetos de produção você vai querer utilizar o golangci-lint, linter que faz o uso de diversos linter por debaixo dos panos, de maneira otimizada.

Utilizamos linters e formatters de maneira separada em cada rule para poder exemplificar como ficaria um Makefile um pouco mais complexo.

tl;dr

Em resumo, o uso do Makefile para projetos em Go representa uma abordagem eficaz e padronizada para automatizar tarefas relacionadas ao desenvolvimento, proporcionando uma estrutura organizada para execução de comandos essenciais. A flexibilidade oferecida pelo Makefile permite que desenvolvedores configurem regras específicas, como formatação, linting e compilação, de forma concisa e fácil de manter.

Top comments (1)

Collapse
 
tsugami profile image
Yslan Ramos

Sempre tive essas dúvidas, obrigado por compartilhar!