A01 - Dos fontes para os executáveis

Questão

-Como podemos usar o CMAKE para compilar arquivos fontes para gerar executáveis?

Objetivos

  • Aprender sobre as ferramentas disponíveis na suíte Cmake.

  • Aprender a escrever um script CMakeLists.txt simples.

  • Aprender a diferença entre build systems, build tools, e build system generator.

  • Aprender a distinguir entre tempos de configuração, geração, and construção.

O que é CMAKE e por que você deveria se importar?

Sempre que você executa um software, qualquer que seja, desde aplicativos de calendário até programas de computação intensivos, haverá um sistema de construção envolvido na transformação do código-fonte em arquivos binários que podem ser executados nos dispositivos que você esteja usando.

CMake é uma ferramenta open-source que permite gerar automaticamente scripts de construção de aplicação em diferentes plataformas. Ele fornece uma família de ferramentas e um linguagem para descrever um o sistema de compilação quando as ferramentas de construção apropriadas são invocadas.

A linguagem independe da plataforma e do compilador: você pode reutilizar o mesmo scripts CMake para obter sistemas de construção nativos em qualquer plataforma.

_images/build-systems.svg

Em sistemas GNU/Linux, o sistema de construção nativo será uma coleção de Makefile-s. A ferramenta de construção make usa estes Makefile-s para transformar fontes em executáveis e bibliotecas. CMake abstrai o processo de gerar o Makefile-s em um script genérico.

Um sistema de compilação baseado em CMAKE:

  • Pode trazer seu software mais perto de ser independente de plataforma e do compilador.

  • Tem um bom suporte em muitos ambientes de desenvolvimento integrados (IDES).

  • Pode rastreiar automaticamente e propagar dependências internas em seu projeto.

Hello, CMake!

Há poucas coisas para notar aqui:

  1. Qualquer sistema de compilação CMake invocará os seguintes comandos no Cmakelists.txt raiz

  2. Não diferença nos Comandos e variáveis CMake escritos em minúsculo ou maiúsculas. No entanto, os arquivos de scripts devem ser Chamado exatamente CMakeLists.txt!

  3. O comando para adicionar executáveis ao sistema de compilação é, sem surpresa, add_executable:

  4. Com o CMAKE, você pode abstrair a geração do sistema de compilação e também a invocação das ferramentas de construção.

Coloque o seu CMakeLists.txt sob controle de versão.

Todos os arquivos relacionados ao cmake evoluirão junto com sua base de código. Assim, é uma boa ideia colocá-los sob controle de versão.

Um conjunto de ferramentas completo

Cmake oferece uma um ferramental completo para gerenciar o ciclo de desenvolvimento: de fontes para scripts/projetos de construão, testes e implantação. Neste tutorial, vamos discutir:

  • Configuração: Esse é o estágio quando cmake é invocado para gerar o sistema de construção a partir de um arquivo CMakeLists.txt.

  • Construção: Isso é tratado pelas ferramentas de construção nativa

  • Teste: Nesta fase, você testará os artefatos construidos.

_images/cmake-times.jpg

Você pode gerenciar todos os estágios de uma vida útil de um projeto de software com as ferramentas fornecidas pelo CMAKE. Esta figura mostra todas essas etapas e qual ferramenta é apropriada para cada um. A figura é reproduzida do CMake Cookbook e é licenciado sob o termos do CC-BY-SA.

Produzindo bibliotecas

CMake pode ser usado para produzir bibliotecas, bem como executáveis. O comando que deve ser usado nesse caso é add_library:

Você pode vincular bibliotecas em executáveis com target_link_libraries:

Executáveis e bibliotecas são targets

Vamos encontrar o termo alvo (target) repetidamente. Em cmake, um alvo é qualquer objeto dado como primeiro argumento para add_executable ou add_library. Sempre que você precisar organizar projetos complexo, pense em termos de alvos e suas dependências. Toda a família de comandos cmake target_* Pode ser usado para expressar dependências e é muito mais eficaz do que acompanhar o estado de variáveis. Vamos esclarecer esses conceitos em A06 -Sistemas de compilação baseados em alvos com CMake.

Exercício 1: Produzindo bibliotecas

Você pode encontrar um projeto base na pasta source/code/day-1/01_libraries-cxx .

  1. Escreva um CMakeLists.txt para compilar os códigos-fontes Message.hpp e Message.cpp como uma bibliotecas. Não especifique o tipo de biblioteca, compartilhada ou estática, explicitamente.

  2. Adicione o executável hello-world.cpp.

  3. Vincule a biblioteca ao executável.

Uma solução está na subpasta solution.

Que tipo de biblioteca você conseguiu?Estático ou compartilhado?

Resumo

  • O CMAKE é um gerador de sistema de contrução, e não sistema de compilação.

  • Escrevemos o script CMakeLists.txt para descrever como as ferramentas de construção criarão artefatos de código-fontes.

  • Você pode usar o conjunto de ferramentas CMAKE para gerenciar toda ciclo de produção de um software vida: de arquivos-fontes até testes e instalação.

  • A estrutura do projeto é espelhada na pasta Build.