
1. Introdução
Este artigo descreve os programas de teste e empacotamento usando o CMake, um conjunto flexível e versátil de utilitários para o desenvolvimento de vários produtos de software. É altamente recomendável que você leia a primeira e a segunda parte do manual para evitar entender mal a sintaxe e como o CMake funciona.
Lançamento do CMake
A seguir, exemplos de uso da linguagem CMake que você deve praticar. Experimente o código-fonte modificando os comandos existentes e adicionando novos. Para executar esses exemplos, instale o CMake no site oficial .
Exemplo de teste
Como mencionado anteriormente, o CMake suporta testes automáticos de programas. Esse recurso é muito fácil de usar - basta escrever alguns comandos no CMakeLists.txt
usual e executar os testes usando ctest
ou make test
. À sua disposição, há uma verificação da saída dos programas, análise dinâmica da memória e muito mais.
Vamos considerar o processo de teste do programa com um exemplo específico. O arquivo de origem Multiply.c
contém o seguinte código:
#include <stdio.h> #include <stdlib.h> #define ARG_COUNT 3 int main(const int argc, const char *argv[]) { if (argc != ARG_COUNT) { fprintf(stderr, "Error!\n"); return EXIT_FAILURE; } const int first = atoi(argv[1]); const int second = atoi(argv[2]); printf("The result is: %d\n", first * second); return EXIT_SUCCESS; }
Este código exibe o resultado da multiplicação de dois argumentos no console. Observe que uma situação de ocorrência de um erro também é possível se o número real de argumentos não atender ao esperado: nesse caso, o erro será exibido no fluxo de erros Error!
.
No mesmo diretório está o arquivo CMakeLists.txt
com uma descrição do processo de criação, contendo o código abaixo:
cmake_minimum_required(VERSION 3.0) project(MyProgram) add_executable(Multiply Multiply.c) set(MULTIPLY_TIMEOUT 1)
Vamos considerar tudo em ordem. Os quatro primeiros comandos devem ser familiares para você no artigo anterior , e o próximo comando enable_testing
levanta várias questões. Em essência, este comando notifica o CMake apenas da sua intenção de testar o programa, gerando simultaneamente alguns arquivos de configuração, cuja existência você não precisa saber.
Os três add_test
seguir adicionam testes ao projeto atual. A forma abreviada desse comando leva o nome do teste como o primeiro argumento e os argumentos subseqüentes formam um comando shell para executar o teste.
Uma série de comandos set_tests_properties
define o comportamento de testes individuais. Após a lista de itens de teste, a palavra-chave PROPERTIES
segue, sinalizando o início da lista de propriedades, com o formato < > < >
e definido para os testes selecionados. Uma lista completa de propriedades disponíveis está aqui .
Para todos os testes, o tempo máximo de execução é definido como um segundo com a propriedade TIMEOUT
e, para os testes subsequentes, a saída esperada é definida com as FAIL_REGULAR_EXPRESSION
e FAIL_REGULAR_EXPRESSION
(por exemplo, se a expressão regular The result is: 3105
corresponder, o teste do FirstTest
continuará e se corresponder com a expressão Error!
teste para e é considerado com falha).
Maneiras de ativar o teste
Existe um análogo do enable_testing
- esta é a inclusão do módulo CTest
através do comando include
. Em geral, a inclusão de um módulo é mais universal, mas ainda há uma diferença entre eles.
O comando enable_testing
permite testar o diretório atual e todos os subsequentes. Ele deve estar localizado na raiz CMakeLists.txt
, pois o CTest espera um arquivo de teste na raiz da montagem.
A ativação do módulo CTest
configura o projeto para teste usando CTest / CDash e também determina automaticamente a opção BUILD_TESTING
, que aceita true quando o teste é possível (o padrão é ON
). Portanto, ao usar este comando, é razoável descrever o processo de teste desta maneira:
if(BUILD_TESTING) add_test(FirstTest Test 1) add_test(SecondTest Test 2) add_test(ThirdTest Test 3)
Execução de teste
Uma série de comandos cmake . && cmake --build . && ctest .
cmake . && cmake --build . && ctest .
todos os três testes são executados. O ctest -R <RegularExpression>
executa um conjunto de testes que satisfazem uma determinada expressão regular. Por exemplo, o ctest -R ThirdTest
executa apenas o terceiro teste.
Exemplo de embalagem
Para criar um pacote de arquivos de origem, bibliotecas e arquivos executáveis, basta descrever a instalação dos arquivos necessários usando o comando install
e, em seguida, ativar o módulo CPack
o comando include
:
Nesse caso, o comando install
notifica o gerador de pacotes do diretório de instalação de destino Multiply
. Sem escrever comandos de instalação, a geração de pacotes não é possível.
A seguir, são listadas as características do pacote, configurando várias variáveis. De fato, existem muitas variáveis que empacotam adequadamente os pacotes. A maioria deles é opcional, mas alguns geradores de pacotes exigem sua definição. Uma lista de variáveis comuns a todos os geradores de pacotes está disponível aqui .
A definição da variável CPACK_GENERATOR
é CPACK_GENERATOR
- é uma lista de geradores de pacotes chamados pelo utilitário cpack
. Nesse caso, leva o valor DEB
, portanto, um pacote debian é gerado no diretório raiz do aplicativo de visão geral.
Finalmente, o módulo CPack
é CPack
, configurando o futuro pacote do projeto usando as variáveis definidas anteriormente e o comando de instalação para o arquivo executável, além de adicionar dois destinos de montagem - package
e package_source
(montagem binária e montagem de origem, respectivamente).
Execução de embalagem
Uma série de comandos cmake . && cmake --build . && cmake --build . --target package
cmake . && cmake --build . && cmake --build . --target package
cmake . && cmake --build . && cmake --build . --target package
lançado para executar o gerador selecionado para criar um pacote binário e os comandos cmake . && cmake --build . && cmake --build . --target package_source
cmake . && cmake --build . && cmake --build . --target package_source
cmake . && cmake --build . && cmake --build . --target package_source
gera um pacote de origem diretamente no diretório raiz.
Conclusão
Neste ponto, a série de tutoriais completos do CMake chegou ao fim. Espero que você tenha aprendido muito material útil e melhorado suas habilidades de programação. Boa sorte