CMake - CMake

CMake
Cmake.svg
Cmake com Clang screenshot.png
Desenvolvedor (s) Andy Cedilnik, Bill Hoffman, Brad King, Ken Martin, Alexander Neundorf
lançamento inicial 2000 ; 21 anos atras ( 2000 )
Versão estável
3.21.3  Edite isso no Wikidata / 20 de setembro de 2021 ; 21 dias atrás ( 20 de setembro de 2021 )
Versão de visualização
3.21.0-rc3  Edite isso no Wikidata / 8 de julho de 2021 ; 3 meses atrás ( 8 de julho de 2021 )
Repositório
Escrito em C , C ++
Sistema operacional Plataforma cruzada
Modelo Ferramentas de desenvolvimento de software
Licença Novo BSD
Local na rede Internet cmake .org Edite isso no Wikidata

No desenvolvimento de software , o CMake é um software de código aberto e gratuito de plataforma cruzada para automação de construção , teste , empacotamento e instalação de software usando um método independente do compilador . CMake não é um sistema de construção, mas gera arquivos de construção de outro sistema. Ele oferece suporte a hierarquias de diretório e aplicativos que dependem de várias bibliotecas. Ele é usado em conjunto com ambientes de construção nativos, como Make , Qt Creator , Ninja , Android Studio , Xcode da Apple e Microsoft Visual Studio . Ele tem dependências mínimas, exigindo apenas um compilador C ++ em seu próprio sistema de construção.

O CMake é distribuído como software de código aberto sob a licença permissiva New BSD .

História

O desenvolvimento do CMake começou em 1999 em resposta à necessidade de um ambiente de construção de plataforma cruzada para o Insight Segmentation and Registration Toolkit . O projeto é financiado pela Biblioteca Nacional de Medicina dos Estados Unidos como parte do Projeto Humano Visível . Foi parcialmente inspirado no pcmaker, feito por Ken Martin e outros desenvolvedores para oferecer suporte ao Visualization Toolkit (VTK) . No Kitware , Bill Hoffman combinou componentes do pcmaker com suas próprias ideias, se esforçando para imitar a funcionalidade dos scripts de configuração do Unix . O CMake foi implementado pela primeira vez em 2000 e posteriormente desenvolvido em 2001.

O desenvolvimento e as melhorias contínuos foram impulsionados pela incorporação do CMake nos próprios sistemas dos desenvolvedores, incluindo o Projeto VXL , os recursos de CABO adicionados por Brad King e o P&D Corporativo da GE para suporte do DART. Recursos adicionais foram criados quando VTK fez a transição para CMake para seu ambiente de construção e para suportar ParaView .

A versão 3.0 foi lançada em junho de 2014. Ela foi descrita como o início de "Modern CMake". Os especialistas agora aconselham evitar variáveis ​​em favor de alvos e propriedades . Os comandos add_compile_options, include_directories, link_directories, link_librariesque estavam no núcleo de CCertifique 2 deve agora ser substituído por comandos específicos do alvo.

Recursos

Um recurso importante é a capacidade de (opcionalmente) colocar saídas do compilador (como arquivos de objeto) fora da árvore de origem. Isso permite várias compilações da mesma árvore de origem e compilação cruzada . Ele também mantém a árvore de origem separada, garantindo que a remoção de um diretório de construção não remova os arquivos de origem. Os usuários não estão protegidos contra a remoção do primeiro por acidente.

Estrutura flexível do projeto

O CMake pode localizar executáveis, arquivos e bibliotecas em todo o sistema e especificados pelo usuário. Esses locais são armazenados em um cache , que pode então ser adaptado antes de gerar os arquivos de construção de destino. O cache pode ser editado com um editor gráfico, que é enviado com o CMake.

Hierarquias de diretório complicadas e aplicativos que dependem de várias bibliotecas são bem suportados pelo CMake. Por exemplo, o CMake é capaz de acomodar um projeto que possui vários kits de ferramentas ou bibliotecas, cada uma com vários diretórios. Além disso, o CMake pode trabalhar com projetos que requerem a criação de executáveis ​​antes de gerar o código a ser compilado para o aplicativo final. Seu design extensível de código aberto permite que o CMake seja adaptado conforme necessário para projetos específicos.

Suporte de configuração de IDEs

CMake pode gerar arquivos de projeto para vários IDEs populares , como Microsoft Visual Studio , Xcode e Eclipse CDT . Ele também pode produzir scripts de construção para MSBuild ou NMake no Windows; Unix Make em plataformas do tipo Unix, como Linux , macOS e Cygwin ; e Ninja em plataformas Windows e semelhantes a Unix.

Processo de construção

A construção de um programa ou biblioteca com CMake é um processo de duas fases. Primeiro, os arquivos de construção padrão são criados (gerados) a partir dos arquivos de configuração (CMakeLists.txt) que são escritos na linguagem CMake . Em seguida, as ferramentas de construção nativas da plataforma (cadeia de ferramentas nativas) são usadas para a construção real de programas.

Os arquivos de construção são configurados dependendo do gerador usado (por exemplo, Makefiles Unix para make ). Os usuários avançados também podem criar e incorporar geradores de makefile adicionais para suportar suas necessidades específicas de compilador e sistema operacional. Os arquivos gerados são normalmente colocados (usando cmakeo sinalizador de) em uma pasta fora da pasta de origem (fora da compilação de origem), por exemplo build/,.

Cada projeto de construção, por sua vez, contém um CMakeCache.txtarquivo e CMakeFilesdiretório em cada (sub) diretório dos projetos (por acaso incluído pelo add_subdirectory(...)comando anterior) ajudando a evitar ou acelerar o estágio de regeneração uma vez que é executado novamente.

Uma vez que o Makefile (ou alternativa) foi gerado, o comportamento de construção pode ser ajustado por meio de propriedades de destino (desde a versão 3.1) ou por CMAKE_...meio de variáveis ​​globais prefixadas. O último é desencorajado para configurações apenas de destino porque as variáveis ​​também são usadas para configurar o próprio CMake e para definir os padrões iniciais.

Tipos de alvos de construção

Dependendo da configuração do CMakeLists.txt, os arquivos de construção podem ser executáveis, bibliotecas (por exemplo libxyz, xyz.dlletc.), bibliotecas de arquivos de objetos ou pseudo-alvos (incluindo aliases). O CMake pode produzir arquivos de objeto que podem ser vinculados por binários / bibliotecas executáveis, evitando vinculação dinâmica (em tempo de execução) e usando uma estática (em tempo de compilação). Isso permite flexibilidade na configuração de várias otimizações.

As dependências de compilação podem ser determinadas automaticamente.

Cabeçalhos pré-compilados

É possível gerar cabeçalhos pré-compilados usando CMake desde a versão 3.6.

Língua

CMakeLists.txt

CMake tem uma linguagem de script imperativa e interpretada relativamente simples . Ele suporta variáveis, métodos de manipulação de string, matrizes, declarações de função / macro e inclusão de módulo (importação). Os comandos (ou diretivas) do CMake Language são lidos por cmakeum arquivo denominado CMakeLists.txt. Este arquivo especifica os arquivos fonte e parâmetros de construção, que o cmake irá colocar na especificação de construção do projeto (como um Makefile). Além disso, os .cmakearquivos -suffixed podem conter scripts usados ​​pelo cmake.

Para gerar os arquivos de construção de um projeto, invoca cmake-se o terminal e especifica o diretório que o contém CMakeLists.txt. Este arquivo contém um ou mais comandos na forma de COMMAND(argument ...).

Sintaxe de comando

Os argumentos dos comandos são separados por espaços em branco e podem incluir palavras-chave para grupos separados de argumentos. Os comandos podem ter palavras-chave, por exemplo, no comando é a palavra-chave . Ele pode servir como um delimitador entre a lista de arquivos de origem e algumas outras opções. SET_SOURCE_FILE_PROPERTIES(source_file ... COMPILE_FLAGS compiler_option ...)COMPILE_FLAGS

Exemplos de comandos que o cmake inclui para especificar alvos e suas dependências (a serem construídos pelo conjunto de ferramentas nativo) e que servem como ponto de partida do CMakeLists.txt:

  • add_executable(...)- declara um alvo binário executável com fontes (depende do idioma escolhido) a serem construídas
  • add_library(...) - o mesmo, mas para uma biblioteca
  • target_link_libraries(...) - adiciona dependências etc.

Strings JSON

Cmake suporta a extração de valores em variáveis ​​das strings de dados JSON (desde a versão 3.19).

Internos

Os programas executáveis ​​CMake, CPack e CTest são escritos na linguagem de programação C ++ .

Muitas das funcionalidades do CMake são implementadas em módulos escritos na linguagem CMake .

Desde a versão 3.0, a documentação do CMake usa marcação reStructuredText . As páginas HTML e as páginas do manual são geradas pelo gerador de documentação Sphinx .

Módulos e ferramentas

O CMake vem com vários .cmakemódulos e ferramentas. Isso facilita o trabalho, como encontrar dependências (integradas e externas, por exemplo, FindXYZmódulos), testar o ambiente da cadeia de ferramentas e executáveis, liberar pacotes ( CPackmódulo e cpackcomando) e gerenciar dependências em projetos externos ( ExternalProjectmódulo):

  • ctest - é usado para comandos de teste de destino especificados por CMakeLists.txt
  • ccmake e cmake-gui - ajusta e atualiza as variáveis ​​de configuração destinadas ao sistema de compilação nativo
  • cpack - ajuda a empacotar software

CPack

CPack é um sistema de empacotamento para distribuição de software. É totalmente integrado ao CMake, mas pode funcionar sem ele.

Ele pode ser usado para gerar:

Adotantes

Código aberto

Software construído usando CMake inclui: MySQL , Boost (bibliotecas C ++) , KDE / KDE Plasma 5 - Ambiente de Trabalho para sistemas baseados em Linux, KiCAD , FreeCAD , Webkit e editor gráfico Blender 3D .

Ferramentas científicas

O software usado pelo experimento ATLAS é construído usando o CMake. O próprio software é escrito em C / C ++ e Python.

Exemplos

Olá Mundo

Os arquivos de código-fonte a seguir demonstram como construir um programa simples hello world escrito em C ++ usando CMake. Os arquivos de origem são colocados em um src/diretório.

// src/Hello_world.cc
#include <iostream>

int main()
{
    std::cout << "Hello, world!\n";
}
# src/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

# set the project name
project("Hello World")

# specify the executable and corresponding source file
add_executable(hello "Hello_world.cc")

script bash para executar o CMake em um sistema Linux . Este exemplo pressupõe que o script será mantido próximo à src/pasta:

#!/usr/bin/env bash
# Place this file next to src/ folder

cmake -S src/ -B build/     # Generate configs from the src/ folder into a build/ one
cmake --build build/        # Start building inside the build/ folder
./build/hello               # Run the compiled program.  Outputs "Hello, world!"

Veja também

Referências

links externos