Quão importante é aprender makefiles? [fechadas]

12

Trabalho em c ++ principalmente como hobby (ainda estou na escola e, portanto, não tenho um emprego de verdade). Os IDEs geram o makefile para mim e, por isso, estou me perguntando se vale a pena aprender como fazê-los eu mesmo. Por "vale a pena aprender", quero dizer, devo largar tudo e aprender a escrevê-los antes de continuar aprendendo c ++? Aprendê-los será realmente necessário? Se sim, devo aprender sobre eles (sintaxe geral e entender como eles funcionam etc.) ou realmente aprender a escrevê-los?

sinθ
fonte
1
a maioria dos projetos de código aberto faz uso pesado de makefiles de uma maneira ou de outra. Então, sim, você deve aprender como os makefiles funcionam. Escrevê-los por mãos é outra história e deve ser evitado em detrimento de gerá-los por alguma ferramenta exceto que você tem muito poucos arquivos ou pode usar regras genéricas / implícitas e outras técnicas semelhantes
permeakra
se você quiser que outras pessoas compilem sua fonte no Linux e outro sistema operacional baseado em Unix, precisará aprendê-las.
Você poderia aprender as noções básicas de Makefiles, dependências e substituições etc, em menos tempo que vai levá-lo para ler todas as respostas a esta pergunta :)
JohnB

Respostas:

14

Sim, definitivamente vale a pena entender como os Makefiles funcionam. Pode não ser relevante para você agora (porque você está usando um IDE que os gera), mas as chances são de que o conhecimento seja útil no futuro.

Por "vale a pena aprender", quero dizer, devo largar tudo e aprender a escrevê-los antes de continuar aprendendo c ++?

Francamente, essa é uma noção bizarra de "vale a pena aprender" ...

Mas não, acho que você não precisa fazer isso.

Aprendê-los será realmente necessário?

Não podemos prever se você realmente precisará desse conhecimento no futuro. Depende se você continua com a programação C ++ e em qual contexto você o faz.

Se sim, devo aprender sobre eles (sintaxe geral e entender como eles funcionam etc.) ou realmente aprender a escrevê-los?

Eu recomendaria ambos. Se você não pode escrever um Makefile, é discutível que você saiba o que está acontecendo.

Há outro ponto de vista que diz que muito conhecimento não é útil.

Se você se aprofundar nisso, aprenderá que existem muitas versões diferentes do Make, e que é difícil escrever um Makefile complicado que funcione com várias versões do Make em várias plataformas. No entanto, no mundo do código aberto, é "melhor prática" usar ferramentas como automake, autoconfetc., para gerar os makefiles etc. Se você fizer isso, grande parte da complexidade relacionada à versão / plataforma será tratada nos bastidores. .


Por fim, você marcou a pergunta com "java". Minha opinião é que você não deve usar makepara criar aplicativos Java (a menos que esteja construindo bibliotecas de código nativas também). Existem ferramentas de construção específicas para Java que são muito mais fáceis de usar ... e fazem um trabalho melhor que make.

Stephen C
fonte
8

Se você estiver trabalhando com sistemas operacionais de código aberto ou similares ao Unix, sim. No entanto, tenha coragem, eles não são tão complicados. O aprendizado makepoupará muito tempo a longo prazo.

EhevuTov
fonte
Aprendendo a ler ou aprendendo a escrever?
Ambos. Você quer saber como lê-lo para poder depurar problemas do software que usa ou escrever para poder criar seus próprios.
EhevuTov
Então eu tenho que discordar da parte da escrita. Existem muitas outras maneiras - sem dúvida muito melhores - de automatizar compilações. Escrever makefiles realmente úteis está longe de ser trivial e não é necessário.
3

Makefiles são importantes nos sistemas UNIX (por exemplo, AIX, Linux, OS X). No entanto, acho que sua importância absoluta "você precisa saber" diminuiu nos últimos anos. Por exemplo, você realmente não os encontra no desenvolvimento do Windows (Visual Studio, etc.) e o XCode (no OS X) usa um sistema completamente diferente. Eu não gosto muito de Java, mas acho que eles usam arquivos form e outros enfeites.

Existe um sistema muito interessante chamado CMake que gera arquivos de compilação nativos para o sistema operacional em que você está executando. Por exemplo, se você escrever sua especificação de projeto no CMake, poderá criar um projeto de criação do Visual Studio no Windows, um projeto XCode no Mac e um Makefile no Linux. De certa forma, o CMake substitui o autoconf e o automake.

Normalmente, eu crio arquivos do CMake para meus "grandes projetos", mas conheço o Make, caso queira escrever um Makefile rápido "apenas conclua". É bom para sua alfabetização cultural, porque existem inúmeras bibliotecas de software que usam Makefiles, e você inevitavelmente precisará editar os compiladores e os locais das bibliotecas específicos. Mas você descobrirá que grandes projetos (como o KDE) estão migrando para o CMake e similares, já que o Make tem algumas limitações que criam sua cabeça feia quando os projetos se complicam.

Eric Brown
fonte
Aprender o CMake será uma ordem de magnitude mais benéfica. Makefiles podem ser vistos como um detalhe de implementação - não se preocupe em aprendê-los (até que sejam realmente obrigados a fazê-lo), assim como os arquivos de projeto do Visual Studio.
2

Eu sou preconceituosa, pois acho que os makefiles são um sistema terrível. Você deve aprender a sintaxe geral para modificar um makefile existente. Mas acho que não é útil aprender tudo sobre isso nem criar um a partir do zero.


fonte
Importa-se de explicar por que os makefiles são um sistema terrível? Comparado com o que?
JonnyJD
@ JonnyJD: Uma coisa é que eu não acredito que um bom sistema de compilação deva colocar um arquivo make em cada subdiretório. Mas é ruim porque não é muito mais fácil de usar do que escrever um arquivo bat que realmente está dizendo algo.
Parece mais que você não gosta de gerar arquivos de construção manualmente. O que por si só não é grande coisa. Makefiles são uma variante que deve ser possível ler e escrever manualmente. (modularizado, apenas simplificou o rastreamento de dependência em comparação com o bash / bat). A parte automatizada é automake. A única coisa realmente diferente é especificar dependências em uma GUI e salvar tudo isso em um arquivo de projeto. Ou que sistema de construção é muito menos terrível?
JonnyJD
2

Como em muitos aspectos da saída do IDE, um makefile típico gerado automaticamente é frequentemente ineficientemente estruturado.

Com um nível adequado de entendimento, geralmente é possível melhorar significativamente o desempenho (compilações mais rápidas, etc.). No entanto, a menos que você realmente saiba o que está acontecendo, é mais provável que você FUBAR ao brincar com um arquivo editado automaticamente.

Eu recomendo ser capaz de entender o que está acontecendo ... se você optar por começar a editar um já existente ou criar o seu, é um problema separado.

Andrew
fonte
2

Ser capaz de usar com êxito makeou algo do tipo permite verificar a caixa "entende como modelar as dependências entre partes de um programa composto por mais de um módulo".

Blrfl
fonte
1

Aprender a escrever Makefiles é uma boa idéia por várias razões.

  1. Make é uma linguagem que permite codificar dependências entre componentes por meio de regras. Você terá muita experiência em escrever código dessa maneira, e isso amplia suas ferramentas para pensar em resolver problemas de programação.
  2. Os princípios que você aprende com o Make podem ser usados ​​com Ant, Maven e Rake, se você optar por aprender a programação no mundo Java ou Ruby.
  3. Muitos IDEs possuem arquivos mágicos que carregam informações de configuração para ajudá-lo a construir seu software. Se você não acredita em mim, tente escrever um script para criar seu software sem o IDE. Ao escrever seus próprios Makefiles, você fica muito ciente das dependências entre seu código, bibliotecas e suas variáveis ​​de ambiente. À medida que os sistemas aumentam, isso se torna uma ferramenta útil para depurar seu sistema.
Jay Godse
fonte
0

Você deve sempre tentar entender o sistema de construção que está usando.

Isso não significa necessariamente que você precise criar todos os arquivos de compilação manualmente. A parte importante é entender o que o sistema de compilação está fazendo para o seu projeto e a capacidade geral de compilar pequenos projetos manualmente (como em "digitando comandos em um terminal").

Costumo pensar que criar Makefiles (simples) é o passo mais fácil para entender o que está acontecendo, mas você pode ter outros meios de entender como criar coisas.

Por que / quando aprender Makefiles

Se você mantém a programação apenas para Windows e não espera que mais ninguém compile seu código, sinta-se à vontade para compilar o código como desejar.

Se você deseja programar o agnóstico do compilador (como em "deixe outros decidirem qual compilador ou IDE eles querem usar"), você deve aprender outro sistema de compilação do que apenas deixar o IDE "lidar com ele".

Se você deseja programar para diferentes plataformas, certamente precisará usar um sistema de compilação generalizado.

Isso ainda não significa que você precisa saber como os Makefiles gerados automaticamente funcionam em detalhes. Você só precisa saber como os arquivos de entrada para o sistema de construção funcionam. Às vezes, eles têm uma sintaxe semelhante.


Pessoalmente, gosto muito de Makefiles e os uso para muitas coisas. Não apenas compilando código. Eu crio um Makefile para cada pdf maior que eu criar (com LaTeX) e para cada projeto que eu preciso para automatizar algumas tarefas (construção, empacotamento, upload, atualização de dependências de repositórios de origem, backups manuais pull / push)

No entanto, estou trabalhando muito no terminal e trabalhando com o Linux. Não uso o que você chamaria de um IDE que não seja o vim (poderoso editor de texto) e as ferramentas de console. Isso pode ser muito diferente para você.

Se você já se queixou de ter que executar diferentes comandos recorrentes apenas para "atualizar" / package / upload / .. um "projeto", aprender como escrever Makefiles pode ser algo útil para você.

Se você possui e utiliza ferramentas / GUIs / IDEs para tudo, pode não obter nada com esse conhecimento.

JonnyJD
fonte