Como exatamente o CMake funciona?

158

Não estou pedindo isso apenas para mim. Espero que essa pergunta seja uma referência para os muitos novatos que gostam de mim, que acharam completamente perplexa o que exatamente o que estava acontecendo nos bastidores quando, para um CMakeLists.txtarquivo tão pequeno

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

e tão pequeno tutorial.cpp

int main() { return 0; } 

existem tantos arquivos gerados

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

e uma CMakeFilespasta com tantos arquivos e pastas

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

Não entender o que estava acontecendo nos bastidores (por exemplo: por que arquivos podem ser gerados e qual era o seu objetivo) era o maior obstáculo para aprender o CMake.

Se alguém souber, você poderia explicar por posteridade? Qual é o objetivo desses arquivos e, quando digito cmake ., o que exatamente o cmake está configurando e gerando antes de criar o projeto?

Nav
fonte
1
Estou ciente de compilações fora da fonte. No caso de alguém não fez um fora de construção fonte e ainda está procurando uma maneira de arquivos gerados limpas, esta técnica funciona bem: stackoverflow.com/a/12055610/453673
Nav
3
Há uma descrição maravilhosa em: aosabook.org/en/cmake.html e provavelmente uma resposta detalhada à pergunta (que não pode ser resumida em resumo aqui).
parasrish
@SebTu Link quebrado. A página cmake.html não existe.
Nav
3
@ Nav Yap, estragou a sintaxe da marcação, desculpe. Assim, aqui a versão corrigida: Para pessoas novas no cmake, eu realmente recomendo a leitura da arquitetura do cmake . Ele fornece informações suficientes para ter uma idéia de como o cmake funciona sem se perder em detalhes.
precisa saber é o seguinte

Respostas:

92

O segredo é que você não precisa entender o que os arquivos gerados fazem.

O CMake introduz muita complexidade no sistema de compilação, a maioria dos quais só compensa se você o usar para criar projetos de software complexos.

A boa notícia é que o CMake faz um bom trabalho em manter grande parte dessa confusão longe de você: use compilações fora da fonte e você nem precisa olhar para os arquivos gerados. Se você não fez isso até agora (o que eu acho que é o caso, desde que você escreveu cmake .), verifique-os antes de prosseguir . A mistura do diretório de compilação e de origem é realmente dolorosa com o CMake e não é como o sistema deve ser usado.

Em poucas palavras: em vez de

cd <source_dir>
cmake .

sempre use

cd <build_dir_different_from_source_dir>
cmake <source_dir>

em vez de. Eu normalmente uso uma subpasta vazia builddentro do meu diretório de origem como diretório de construção.

Para aliviar sua dor, deixe-me dar uma rápida visão geral dos arquivos relevantes que o CMake gera:

  • Arquivos de projeto / Makefiles - O que você realmente está interessado: Os arquivos necessários para criar seu projeto no gerador selecionado. Isso pode ser qualquer coisa, desde um Unix Makefile até uma solução do Visual Studio.
  • CMakeCache.txt - Esse é um armazenamento persistente de chave / valor que é usado para armazenar em cache o valor entre as execuções. Os valores armazenados aqui podem ser caminhos para dependências da biblioteca ou se um componente opcional deve ser construído. A lista de variáveis ​​é praticamente idêntica à que você vê ao executar ccmakeou cmake-gui. Isso pode ser útil de vez em quando, mas eu recomendaria usar as ferramentas mencionadas acima para alterar qualquer um dos valores, se possível.
  • Arquivos gerados - pode ser qualquer coisa, desde arquivos de origem gerados automaticamente até exportar macros que ajudam a reintegrar seu projeto criado a outros projetos do CMake. A maioria deles é gerada somente sob demanda e não aparecerá em um projeto simples como o da sua pergunta.
  • Qualquer outra coisa é praticamente barulho para manter o sistema de compilação feliz. Em particular, nunca precisei me preocupar com o que está acontecendo dentro do CMakeFilessubdiretório.

Em geral, você não deve mexer com nenhum dos arquivos que o CMake gera para você. Todos os problemas podem ser resolvidos de dentro CMakeLists.txtde uma maneira ou de outra. Enquanto o resultado criar seu projeto conforme o esperado, você provavelmente estará bem. Não se preocupe muito com os detalhes sangrentos - pois é isso que o CMake estava tentando poupar em primeiro lugar.

ComicSansMS
fonte
Obrigado. Estava ciente das compilações fora da fonte, mas como você veria, o objetivo de fazer essa pergunta era entender mais. A parte CMakeCache.txt da sua resposta realmente ajudou. É esse tipo de explicação que eu estava procurando. Além disso, a última frase da minha pergunta: "o que exatamente é cmake configurando e gerando antes de compilar o projeto "?
Nav
1
CMakeFilesO diretório contém CMakeError.loge é CMakeOutput.logimportante para solucionar problemas de compilações do CMake.
Serge Rogatch
1
Duas coisas que às vezes você precisa verificar no CMakeFiles/target_name.dirdiretório são os arquivos flags.makee link.txt. Eu tive que verificar isso em um projeto complexo, que herdou sinalizadores / coisas vinculadas de projetos upstream. Por exemplo: tive alguns erros porque o TPL A dependia do TPL B. Também meu projeto dependia do B, que eu instalei localmente; mas A usou uma versão do B do meu sistema (em vez da minha instalação local) que tinha diferentes opções ativadas e foi a primeira a causar erros no meu projeto. Apenas olhando para o link.txt, eu pude descobrir que isso estava acontecendo.
22619 bartgol
13

Conforme declarado em seu site:

O Cmake é um sistema de compilação de código aberto de plataforma cruzada para gerenciar o processo de compilação de software usando um método independente do compilador

Na maioria dos casos, é usado para gerar arquivos de projeto / criação - no seu exemplo, foram produzidos os Makefilequais são usados ​​para construir o seu software (principalmente na plataforma Linux / Unix).

O Cmake permite fornecer arquivos de construção de plataforma cruzada que gerariam projetos específicos da plataforma / criariam arquivos para compilação / plataforma específica.

Por exemplo, você pode tentar compilar seu software no Windows com o Visual Studio e, em seguida, com a sintaxe adequada em seu CMakeLists.txtarquivo, você pode iniciar

cmake .

dentro do diretório do seu projeto na plataforma Windows, o Cmake irá gerar todos os arquivos necessários de projeto / solução ( .slnetc.).

Se você deseja criar seu software na plataforma Linux / Unix, basta ir ao diretório de origem onde possui o seu CMakeLists.txtarquivo e acionar o mesmo, cmake .e ele gerará todos os arquivos necessários para a criação do software via simples makeoumake all .

Aqui você tem uma apresentação muito boa sobre as principais funcionalidades do Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

EDITAR

Se você quiser incluir definições de variáveis ​​/ bibliotecas dependentes da plataforma, etc., poderá usar esta sintaxe no CMakeLists.txtarquivo

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

Também existem muitos comandos com os quais você é capaz de impedir a falha da compilação e o Cmake o notificará de que, por exemplo, você não possui bibliotecas de reforço filesysteme regexinstaladas em seu sistema. Para fazer isso, você pode usar a seguinte sintaxe:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Tendo verificado que ele irá gerar os makefiles para o sistema / IDE / compilador apropriado.

Patryk
fonte
1
Obrigado Patryk. Resposta útil, mas o pdf ao qual você vinculou explica principalmente o segundo estágio do aprendizado do CMake, que é basicamente a implementação do CMake. Estou perguntando sobre a explicação do primeiro estágio, em que uma pessoa precisa entender o que está acontecendo no CMake!
Nav
@ Nav Eu expandi minha resposta um pouco. Você ainda pode pesquisar na web para obter mais informações.
Patryk 8/07
Isso está longe de responder à pergunta.
SenhorLucas 26/02
1

Exatamente como o CMake funciona é uma pergunta para os desenvolvedores, portanto, essa pergunta não pode ser respondida aqui.

No entanto, podemos dar um toque de orientação útil sobre quando você deve usar o CMake e, portanto, quando precisa se preocupar com o funcionamento dele. Também não sou fã de respostas "oh, isso simplesmente funciona" - porque, especialmente em software, NADA "simplesmente funciona" e você SEMPRE precisa entrar em detalhes detalhados em algum momento.

O CMake é uma ferramenta de força industrial. Ele automatiza vários processos MUITO complexos e leva em consideração muitas variáveis ​​das quais você talvez não saiba, especialmente como um desenvolvedor relativamente novo, provavelmente trabalhando com conhecimento limitado de todos os sistemas operacionais e ferramentas de construção que o CMake pode manipular. A razão pela qual tantos arquivos são gerados e o motivo pelo qual as coisas parecem tão complexas é porque todos esses outros sistemas são complexos e devem ser contabilizados e automatizados. Além disso, existem os problemas de "armazenamento em cache" e outros recursos da ferramenta que economizam tempo. Compreender tudo no CMake significaria entender tudo nessas ferramentas de compilação e sistemas operacionais e todas as combinações possíveis dessas variáveis, o que, como você pode imaginar, é impossível.

É importante observar que, se você não é responsável por gerenciar um grande sistema de compilação entre plataformas, e sua base de código é de alguns KLOC, talvez até 100KLOG, o uso do CMake parece um pouco com a remoção de árvores florestais de 100.000 dólares máquina para remover ervas daninhas do seu jardim de 2 pés por 2 pés. (A propósito, se você nunca viu uma máquina dessas, procure uma no youtube, elas são incríveis)

Se o seu sistema de compilação for pequeno e simples, provavelmente será melhor apenas escrever seus próprios makefiles à mão ou escrevê-los você mesmo. Quando seus makefiles se tornam pesados ​​ou você precisa criar uma versão do seu sistema em outra plataforma, você pode mudar para o CMake. Nesse ponto, você terá muitos problemas para resolver e poderá fazer perguntas mais focadas sobre isso. Enquanto isso, confira alguns dos ótimos livros que foram escritos sobre o CMake, ou melhor ainda, escreva você mesmo! 8)

Senhor Jeps
fonte