Respostas:
Make (ou melhor, um Makefile) é um sistema de compilação - ele dirige o compilador e outras ferramentas de compilação para criar seu código.
O CMake é um gerador de sistemas de construção. Pode produzir Makefiles, arquivos de compilação Ninja, projetos KDEvelop ou Xcode, soluções Visual Studio. Do mesmo ponto de partida, o mesmo arquivo CMakeLists.txt. Portanto, se você tem um projeto independente de plataforma, o CMake é uma maneira de torná-lo independente do sistema.
Se você tem desenvolvedores do Windows acostumados a desenvolvedores do Visual Studio e Unix que juram pelo GNU Make, o CMake é (um dos) caminhos a seguir.
Eu sempre recomendo usar o CMake (ou outro gerador de sistema de construção, mas o CMake é minha preferência pessoal) se você pretende que seu projeto seja multiplataforma ou amplamente utilizável. O próprio CMake também oferece alguns recursos interessantes, como detecção de dependência, gerenciamento de interface de biblioteca ou integração com CTest, CDash e CPack.
O uso de um gerador de sistema de construção torna seu projeto mais à prova de futuro. Mesmo se você for GNU-Make-only agora, e se depois decidir expandir para outras plataformas (seja Windows ou algo incorporado), ou apenas desejar usar um IDE?
find_package()
) ou suporte a teste / empacotamento.
A afirmação de que o CMake é um "gerador de compilação" é um equívoco comum.
Não é tecnicamente errado; apenas descreve como funciona, mas não o que faz.
No contexto da pergunta, eles fazem o mesmo: pegue um monte de arquivos C / C ++ e os transforme em binários.
Então, qual é a diferença real?
O CMake é muito mais de alto nível. Ele foi adaptado para compilar C ++, para o qual você escreve muito menos código de compilação, mas também pode ser usado para compilação de uso geral. make
também possui algumas regras C / C ++ integradas, mas são principalmente inúteis.
CMake
faz uma compilação em duas etapas: gera um script de compilação de baixo nível em ninja
ou em make
muitos outros geradores e, em seguida, você o executa. Todas as partes do script de shell que normalmente são empilhadas Makefile
são executadas apenas no estágio de geração. Assim, a CMake
construção pode ter ordens de magnitude mais rápidas.
A gramática de CMake
é muito mais fácil de suportar para ferramentas externas do que as de make .
Depois de make
criar um artefato, ele esquece como foi construído. De quais fontes ele foi criado, quais sinalizadores do compilador? CMake
rastreia, make
deixa com você. Se uma das fontes da biblioteca foi removida desde a versão anterior Makefile
, make
não será reconstruída.
Moderno CMake
(a partir da versão 3.algo) funciona em termos de dependências entre "destinos". Um destino ainda é um único arquivo otput (infelizmente), mas pode ter dependências transitivas ("pública" / "interface" em termos do CMake)). Essas dependências transitivas podem ser expostas ou ocultas dos pacotes dependentes. CMake
irá gerenciar diretórios para você também. Com make
, você fica preso no nível arquivo por arquivo e gerencia diretórios à mão.
Você pode codificar algo make
usando arquivos de sinalização para cobrir as duas últimas lacunas, mas está por sua conta. make
contém um idioma completo de Turing (até dois, às vezes três contando Guile ), e todos eles são horríveis.
Para ser honesto, isso é o que CMake
e make
têm em comum - suas línguas são bastante horrível:
começar com.
Mas CMake
você escreve muito menos linhas de código.