Guia completo do CMake. Parte Três: Teste e Embalagem


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) #   : enable_testing() #  : add_test(FirstTest Multiply 15 207) add_test(SecondTest Multiply -54 -785) add_test(ThirdTest Multiply 85234) #   : set_tests_properties(FirstTest SecondTest ThirdTest PROPERTIES TIMEOUT ${MULTIPLY_TIMEOUT}) set_tests_properties(FirstTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 3105" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(SecondTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 42390" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(ThirdTest PROPERTIES PASS_REGULAR_EXPRESSION "Error!") 

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) #  ... endif() 

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 :


 #    "Multiply"   "bin": install(TARGETS Multiply DESTINATION bin) #    : set(CPACK_PACKAGE_NAME "Multiply") set(CPACK_PACKAGE_VENDOR "MyCompany") set(CPACK_PACKAGE_CONTACT "https://myprojectsite.org") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "mycontacts@gmail.com") set(CPACK_PACKAGE_DESCRIPTION "The most stupid program ever written") #    : set(CPACK_GENERATOR "DEB") #    "CPack": include(CPack) 

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

Source: https://habr.com/ru/post/pt433822/


All Articles