Um momento
Aula 08
Cursos / Golang: Ambiente e Ferramentas de Desenvolvimento da Linguagem Go
Escrita de um Makefile e o Uso do make no Desenvolvimento de Programas de Golang

Summary

Resumo da Aula sobre Makefile

Introdução

  • A aula apresenta o Makefile, uma ferramenta tradicional no desenvolvimento de software.
  • O foco é na automação do processo de criação de builds, especialmente para projetos em Go.

Ferramentas Utilizadas

  • IDE: Visual Studio Code (VS Code) com extensão do Go desativada para demonstração.
  • Comando Make: Usado para automatizar e simplificar a execução de tarefas.

Demonstração Prática

1. Criação do Makefile

  • Criação de um arquivo chamado Makefile.
  • Primeiro alvo implementado: FMT para formatar o código utilizando o comando go fmt.

2. Configurando Dependências

  • O segundo alvo implementado: VET, que depende do alvo FMT.
  • O terceiro alvo adicionado: IMPORTS para corrigir importações faltantes, dependendo de FMT e adicionado por último ao fluxo.

3. Implementação do Build

  • Alvo final: BUILD, dependente do alvo VAT.
  • Alvo Padrão: O Makefile pode definir um alvo padrão usando a variável .DEFAULT_GOAL.

4. Comandos e Execução

  • Explicação sobre execução dos alvos em sequência:
    • Ao executar make, a sequência de tarefas conforme as dependências é realizada.
    • Demonstração de erro corrigido no código usando o comando Import.

5. Criação e Verificação do Executável

  • O executável é gerado com o comando go build.
  • Uso do Makefile economiza tempo ao evitar recompilar arquivos que já estejam atualizados.

Conclusão

  • O Makefile permite a automação do processo de builds, contribuindo para uma melhor organização e eficiência.
  • Applicável não apenas em Go, mas em diversas linguagens e processos de desenvolvimento.

Espero que você tenha gostado dessa aula sobre o básico do uso do Makefile para automação de builds. Vejo você na próxima!

Video Transcript

Olá pessoal, bem-vindo a mais uma aula. Nesta aula eu gostaria de falar de uma ferramenta bem tradicional, um mundo de desenvolvimento de software, mas que eu acho que vai ajudar a automatizar o processo de criar um build. Eu vou falar de Makefile. Você já ouvi falar do programa comando Make, M-A-K-E, disse que a gente vai falar. Embora que a IDE passa, por exemplo, no meu caso, estou usando do lado esquerdo da tela o vejo Studio Code, que já tem a extensão do Go. E a extensão faz as coisas para a gente automaticamente, por exemplo, se eu salvar o meu arquivo, ele vai formatar no estilo padrão de Go automaticamente esse tipo de coisa. Mas para quem gosta mais de automatizar na linha de comando e também isso ajuda a fazer script para a integração continua, TI, CI. Então vamos lá. Para esta aula, desativei a minha extensão do Go para que não salve o arquivo comate automático. Eu gostaria de demonstrar o seguinte, o uso de um Makefile para poder criar um build, esse programa aqui, programa bem simples, um arquivo que eu criei chamado principal.go, do lado esquerdo da tela, que está o arquivo que está aberto. Você note que há uns problemas de formatação nesse arquivo. Eu tinha até algo. Até esqueci de importar, está outra coisa aqui. Então vamos fazer o seguinte, vamos automatizar o processo para criar um build, mas antes de fazer build com Go build, vamos rodar GoVet, vamos rodar o FMT para formatar o código. Eu note que o código está com um formato que não é padrão, não está mostrando aqui. Estes aqui são espaços, dá certo? Vou mudar as configurações do VS Code para mostrar esses. Posso mudar aqui para all, render white space, para eles sempre mostrar os caracteres invisíveis. A norte que o ponto aqui está vendo, que aparece esse ponto em por cinza, ponto significa espaço em branco, não é uma tab, a tab é o padrão de indentação do Go. A norte que o 6 tem a tab corretamente, que essa seta apontando para a direita, significa que tem uma tab aqui, se eu botar espaço, vira esses pontos no VS Code. Então vou criar um arquivo chamado Makefile, certo? Com o primeiro M Myosco, no Makefile vou fazer o seguinte, vamos primeiro começar só pelo FMT. Então eu quero criar esse alvo chamado FMT, certo? Eu vou dizer FMT, o nome do alvo, dois pontos e os pré-requisitos desse alvo. Nesse caso aqui não tem pré-requisito, então eu vou deixar em branco. Na próxima linha você tem que botar uma tab, indentação. Nesse caso eu tenho o Makefile selecionado aqui, o VS Code, então ele automaticamente adiciona tab em vez de espaço em branco quando aperto tecla tab. Ah não, é espaço em branco, é tab mesmo. Eu vou dizer como que se cria ou se gera esse alvo. Eu vou dizer Go, FMT, eu vou deixar as coisas bem simples, só vai ser um arquivo mesmo, principal.go. Então no mundo de Makefile a gente diz os alvos, normalmente seria um arquivo que seria gerado a partir de certo pré-requisitos e então depois de conseguir esses pré-requisitos a gente executa os comandos que seguem nas próximas linhas com a indentação. Então o alvo aqui seria o FMT, dois pontos não há nenhum pré-requisito, então é em branco depois dos dois pontos e a gente vai rodar o comando Go FMT para formatar o arquivo. Então a gente pode testar isso na linha de comando aqui. Como eu estou usando o Linux, ele já vem com o Make, você vai dizer Make, espaço, traço, traço, verger, eu estou usando o Guino Make, quatro pontos dois, ponto um. Os usuários de Windows não têm Make por padrão, então você teria que instalar. Eu recomendo instalar através do chocolate, você vai lá no site do chocolate, você ainda não tiver, é só baixar aquele script, instal.ps1, ele morta lá. Na verdade ele manda você copiar o código, você abre o PowerShell com o administrador, e você cola aquele código que ele te diz na página do chocolate, aí ele vai instalar. E depois para só abrir uma nova linha de comando, cmd.se, comandemestador, editado, show, com install, Make. E depois você vai abrir uma nova janela de cmd e vai dar para usar o Make. Com o Make instalado a gente pode fazer o seguinte, se você falar só o Make, ele vai buscar o Make file no diretório presente aqui que eu tenho, e vai rodar a primeira tarefa ou algo. O que achar, nesse caso é FmT. Você nota que ele roda o comando, e se eu olhar o meu arquivo, você nota que ele já formatou tudo, na maneira padrão do Go. Os espaços foram convertidos para tabs, a indentação foi corrigida, e ele até fez, adicionou esses espaços aqui na minha definição dos campos da struct.libro. Também adicionou espaço, a esquerda e a direita do operador, nesse caso de comparação de dois números, se é igual. Isso é o FmT, vou reverter só para você ver o que era antes, e depois do FmT, a gente já viu isso, vou deixar reverter. Também você quiser dizer Make, pode dizer o Alvo específico, por exemplo, Make é FmT, ele vai rodar FmT. Claro que só tem FmT aqui, mas se você tivesse outros Alvos, poderia fazer. Uma coisa a adicionar aqui é dos Alvos, é sempre bom, no caso que o Alvo tradicionalmente, por exemplo, os Alvos seriam nomes de arquivos. Por causa disso, o Alvo seria as instruções ou uma receita para você poder criar esse arquivo especificado antes dos dois pontos. Como a gente não tem a geração de arquivos, por exemplo, de objetos, quando a gente compre um código-fonte, o FmT, que na verdade não é um arquivo, que é gerado. A gente só modifica o principal.go. Tá certo? Então, a gente vai adicionar esse negócio chamado FmT, ponto FmT, esse Alvo aqui especial, ponto FmT, dois pontos, e o nome do Alvo que a gente quer que seja FmT. FmT significa que não é, como se fosse algo que não é autêntico. Nesse caso, FmT não é um arquivo que é gerado. Então, para a gente poder dizer para o Make, para que a gente não vai gerar nenhum arquivo chamado FmT, a gente fala ponto FmT, dois pontos, e o nome do Alvo que vai ser FmT. Isso vai prevenir qualquer conflito entre arquivos. Se tiver um arquivo FmT na mesma parte, ele não vai ter conflitos se você dizer que é FmT aqui. Também vai melhorar em termos de performance, porque tem esse lance, esse Make ver que o arquivo já foi criado. Por exemplo, se tivesse um arquivo FmT sem esse pône, aí ele não iria executar o comando aqui essa tarefa. Por exemplo, se eu fazer touch FmT, na verdade, criar um arquivo chamado FmT e tentar order o Make, aí ele vai dizer que o FmT está atualizado porque ele viu FmT, certo. Esse arquivo existe, então não preciso fazer mais nada, já está feito. Então, para poder não ter esse conflito, você escreve ponto fmt, dois pontos, e o nome do Alvo nesse caso é FmT, ele vai fazer o Make, vai rodar de novo, ainda que o arquivo exista. É importante isso. Então, com isso legal, vamos fazer outra coisa? Então, temos FmT legal. Eu quero também fazer o VAT, vamos falar VAT. Agora, é claro que eu sei que o VAT vai ser o quê? Go, VAT e o nome dos arquivos. Mas, eu quero fazer o seguinte, eu quero que essa tarefa VAT dependa de outra tarefa, isto é, para poder fazer o VAT, você tem que primeiro fazer outra tarefa, ou tarefas. Nesse caso, eu quero que o VAT dependa do FmT. Então, o Alvo VAT primeiro vai ter como pré-requisito o FmT. Agora, como é que faz FmT? Então, ele vai pular para a linha 4, vai ver, o FmT depende de alguma coisa ou não? Está em branco, depois de dois pontos. Então, vai executar a Go FmT, principal ponto Go. Depois disso, terminou a tarefa FmT, volta lá para linha 1 e não tem mais pré-requisito. Nesse caso, só tem um que é o FmT. Com isso, você pode começar a execução do VAT, que é na linha 2 e em diante. Então, ele vai falar Go VAT, principal ponto Go. O Alvo VAT depende do FmT. Para poder executar as linhas do VAT, preciso primeiro executar as linhas do FmT, que pode até ter uma pré-requisito, mas nesse caso não tem. Então, a gente vai fazer também fone nesse caso, ponto pone, porque o VAT não é um arquivo que será gerado. É um ponto fone, dois pontos, VAT, para não ter aquele conflito. E se eu dizer make, agora, o primeiro tarefa que encontrado no arquivo é o VAT. Então, se eu dizer make, sem dizer VAT, ele vai rodar o tarefa VAT. Então, você note que o primeiro roda o FmT, porque é dependência, depois diz roda o VAT. Aí, quando a gente rodou o VAT, ele teve um problema. O arquivo tem na linha 16, o que eu fiz errado. Ah, é. O FmT não foi importado. Qual é aquela ferramenta que a gente pode usar para poder automaticamente importar as coisas que foram esquecidas? Tem um Go Import. A gente poderia adicionar o Go Import como dependência do VAT para poder corrigir isso. Vamos lá, então. Então, como é que faz para adicionar a dependência aqui? Bem, você poderia depender um, depender de outro, e um depender de outro, ou você pode ter várias dependências. Então, eu posso adicionar um adicional aqui. Nesses casos, depois de FmT, qual seria outra coisa? Seria o Go Import. Então, eu vou falar importos. Ou Go Import, o que você quiser. Qualquer nome. Então, eu vou dizer que importos, dois pontos, não depende de nada. Eu vou dizer Go Import, principal, ponto Go, mas eu acho que o Go Import tem que dizer... Se você só falar Go Import, ele não vai modificar o arquivo. Então, tem que dizer a opção traço W para poder modificar o arquivo. Já tem também a opção traço W para dizer que o arquivo foi modificado. Então, nesse caso aqui, o VAT, quando eu falar VAT, vai depender de FmT primeiro e vai executar FmT, vai depender do import, vai executar o import. Claro que eu também poderia separar isso e fazer o seguinte. Poderia deixar o VAT primeiro depender do import, que o import dependeria do FmT em sequência. Mas eu quero deixar mesmo para Mute para você aprender que não precisa só de um pré-requisito. Pode ter vários. Vamos ver o que dá esse negócio aqui. Ah, também ponho o powne, ponto powne. Antes ou depois, não importa, certo? Pode ser antes ou depois. Puta, antes aqui para você ver que não importa. Powne, import. Porque import não é um arquivo que vai ser gerado, então a gente põe o powne para não ter nenhum conflito e para funcionar o make funcionar sem problemas. Vamos lá falar make. Vamos ver aqui. Então, note que primeiro rodou FmT, depois rodou import, depois rodou o VAT. Vamos revisar de novo. O alvo VAT depende de dois alvos FmT em portes. Primeiro vai para o alvo FmT. Começa o alvo FmT. Tem alguma dependência depois de dois pontos? Não. Então, executa as linhas seguintes. Volta lá para a linha 1, terminamos a tarefa FmT, a próxima alvo é import. Vamos lá para o import, se depende de alguma coisa ou não. Em branco, depois dos dois pontos. Executa as linhas seguintes, então. Executou o gol em portes. Volta lá, acabamos as dependências, podemos executar todos os comandos do VAT na linha seguinte. Então, deu problema na linha 17, o VAT identificou um problema. Aqui foi a linha 17. Eu esqueci de estar dizendo que não tem. Os argumentos são na verdade, precisar de mais de um. Para o John, preciso dizer, join as strings em que ter limitado o que é separado. Posso botar em branco, barra, vígula, qualquer coisa. Salvar, dar o make, de novo, funciona sem problemas. Agora, não criar ainda build, certo? Então, vamos lá. Agora, depois de identificar problemas, podemos criar finalmente a build. Eu vou falar build como algo, e a build vai depender do VAT. E o VAT depende de FMT em portes, então não precisa dizer FMT em portes aqui no build, certo? Ele já depende do VAT, que depende do FMT e do import. Para poder fazer a build, na próxima linha tab, gol, build, o nome do arquivo principal, principal.go. Eu tinha dito que o primeiro alvo que encontrar no arquivo de cima para baixo é que o make vai usar como padrança quando você fala make na linha de comanda. Se você quiser, eu poderia botar o build lá para o final, se eu botar o build lá no final, nunca iria executar o build, a não ser que eu falasse make build. Se eu quiser que o build seja o padrão, em vez do primeiro que encontrar, na linha 4VAT, eu posso atribuir a variável aqui para dizer qual é que vai ser o alvo padrão, certo? Vamos fazer isso da maneira assim. Chama gol, o objetivo. Ponto default, gol, passo, dois pontos igual e o nome do alvo que é build. Ponto default, gol, a gente atribui build. Nesse caso ele vai setar quando você fala make sem nada, sem nenhum argumento na linha de comanda, ele vai automaticamente usar o padrão que é build. Você vê o FMT, impostos, VAT, finalmente build. Por que o build está no final? Se lembra, porque o build depende do VAT e do FMT e do import. Build, primeiro order da penicia VAT, pronto, FMT. Terminou a penicia FMT, vai para imports, order imports, terminou. Pronto, roda o VAT, pronto, volta para requisito do build, terminou, roda o build. Não tem nada a ver com o build estar no final do conteúdo do arquivo. E também pode pôr fone no build que não existe em um arquivo chamado build. Ponto fone, build, dois pontos build. Se eu dar o LS, ele criou o arquivo principal na diretória presente. Tem um lance que você note que sempre que eu falo make, ele roda o comando de novo. Mas se lembra que aquele conflito do arquivo que antes tinha, que ele não rodava o negócio normalmente, porque o arquivo já existia. Você pode usar aquilo na verdade que se você tiver certeza que o principal aqui estiver acompilado e você não quer rodar de novo, você tem certeza que ele vai ver que já tem aí. Mas como faz isso? Você pode dizer o nome desse arquivo como alvo, por exemplo. Se você vai adicionar o principal como alvo e ele der pd de build, olha só. O nome do alvo vai corresponder ao nome do arquivo e não tem fone. E o principal depende de build, então ele vai fazer tudo no caminho do build e esse vai ser como gerar o arquivo principal. Nesse caso, não tem nenhum comando de baixo aqui nas linhas seguintes. Então se eu fizer make, não, mas que não identificou. Ah, porque foi o build. Eu quero falar make principal para ele rodar o alvo principal. Eu esperava que ele já iria dizer que já tinha criado. Ah, porque não foi. Se eu mudar build para principal, vou colocar principal aqui. Talvez seja porque eu tenha que rodar o build como comando principal. Então vou fazer isso de maneira. Então eu mudei build, então o nome e eu tenho que tirar o fone. O nome do arquivo que vai ser gerado é principal, depende de vet e tal e os comandos é golbuild, não sei o que. Se eu falar make, fone sem principal, roda uma, roda outra. Interessante que ele não faz o fone. Se você souber que não está funcionando como eu queria, só este comentário aqui. Mas o que eu queria fazer é demonstrar que se o arquivo já tivesse compilado, ele não faria o make de novo. Isso que normalmente para você economizar na performance e no tempo. Então normalmente se o arquivo, no caso se fosse arquivo de estava compilando e gerasse arquivos de objeto, por exemplo, e se eu tipo as plas. O nome do arquivo.o seria os alvos. E se eles já tivessem sido criados, gerados e não houvessem modificação, ele não iria compilar de novo, ele iria apenas reutilizar. De qualquer maneira, e eu espero que você tenha gostado dessa aula. Você pode fazer mais pra você sobre make, mas esse é o básico, o básico do básico. Para automatizar o processo de criar builds. Na verdade o make você pode fazer usar para não só para golang, para colocar linguagem, ou até para coisa que não é relacionada. Programação, para gerar qualquer coisa baseada na dependência, alvos e comandos e por diante. Tá bom, então por essa aula é só. Eu te vejo na próxima.
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: