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.txt
arquivo 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 CMakeFiles
pasta 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?
Respostas:
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
sempre use
em vez de. Eu normalmente uso uma subpasta vazia
build
dentro 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:
ccmake
oucmake-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.CMakeFiles
subdiretó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.txt
de 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.fonte
CMakeFiles
O diretório contémCMakeError.log
e éCMakeOutput.log
importante para solucionar problemas de compilações do CMake.CMakeFiles/target_name.dir
diretório são os arquivosflags.make
elink.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.Conforme declarado em seu site:
Na maioria dos casos, é usado para gerar arquivos de projeto / criação - no seu exemplo, foram produzidos os
Makefile
quais 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.txt
arquivo, você pode iniciardentro do diretório do seu projeto na plataforma Windows, o Cmake irá gerar todos os arquivos necessários de projeto / solução (
.sln
etc.).Se você deseja criar seu software na plataforma Linux / Unix, basta ir ao diretório de origem onde possui o seu
CMakeLists.txt
arquivo e acionar o mesmo,cmake .
e ele gerará todos os arquivos necessários para a criação do software via simplesmake
oumake 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.txt
arquivoTambé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
filesystem
eregex
instaladas em seu sistema. Para fazer isso, você pode usar a seguinte sintaxe:Tendo verificado que ele irá gerar os makefiles para o sistema / IDE / compilador apropriado.
fonte
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)
fonte