Gu铆a completa de CMake. Tercera parte: pruebas y empaques


Introduccion


Este art铆culo trata sobre los programas de prueba y empaquetado que utilizan CMake, un conjunto flexible y vers谩til de utilidades para desarrollar diversos productos de software. Se recomienda encarecidamente que lea la primera y la segunda parte del manual para evitar malentendidos sobre la sintaxis y c贸mo funciona CMake.


Lanzamiento de CMake


Los siguientes son ejemplos del uso del lenguaje CMake que debe practicar. Experimente con el c贸digo fuente modificando los comandos existentes y agregando otros nuevos. Para ejecutar estos ejemplos, instale CMake desde el sitio web oficial .


Ejemplo de prueba


Como se mencion贸 anteriormente, CMake admite pruebas autom谩ticas de programas. Esta caracter铆stica es muy f谩cil de usar: simplemente escriba algunos comandos en el CMakeLists.txt habitual y luego ejecute las pruebas usando ctest o make test . A su disposici贸n hay una comprobaci贸n de la salida de programas, an谩lisis din谩mico de memoria y mucho m谩s.


Consideraremos el proceso de probar el programa con un ejemplo espec铆fico. El archivo fuente Multiply.c contiene el siguiente 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 muestra el resultado de multiplicar dos argumentos a la consola. Tenga en cuenta que una situaci贸n de ocurrencia de un error tambi茅n es posible si el n煤mero real de argumentos no satisface lo esperado: en este caso, 隆El error se enviar谩 a la secuencia de errores Error! .


En el mismo directorio est谩 el archivo CMakeLists.txt con una descripci贸n del proceso de compilaci贸n, que contiene el siguiente c贸digo:


 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!") 

Consideremos todo en orden. Los primeros cuatro comandos deben ser familiares para usted del art铆culo anterior , y el siguiente comando enable_testing plantea una serie de preguntas. En esencia, este comando solo notifica a CMake de su intenci贸n de probar el programa, generando simult谩neamente algunos archivos de configuraci贸n, cuya existencia no necesita saber.


Los siguientes tres add_test agregan pruebas al proyecto actual. La forma abreviada de este comando toma el nombre de la prueba como primer argumento, y los argumentos posteriores forman un comando de shell para ejecutar la prueba.


Una serie de comandos set_tests_properties establece el comportamiento de las pruebas individuales. Despu茅s de la lista de elementos de prueba, sigue la palabra clave PROPERTIES , que indica el comienzo de la lista de propiedades, que tiene la forma < > < > y se establece para las pruebas seleccionadas. Una lista completa de propiedades disponibles est谩 aqu铆 .


Para todas las pruebas, el tiempo de ejecuci贸n m谩ximo se establece en un segundo con la propiedad TIMEOUT , y luego para las pruebas posteriores, la salida esperada se establece con las FAIL_REGULAR_EXPRESSION PASS_REGULAR_EXPRESSION y FAIL_REGULAR_EXPRESSION (por ejemplo, si la expresi贸n regular The result is: 3105 coincide, luego la prueba FirstTest contin煤a, y si coincide con la expresi贸n Error! prueba se detiene y se considera fallida).


Formas de habilitar las pruebas


Existe un an谩logo del enable_testing : esta es la inclusi贸n del m贸dulo CTest trav茅s del comando include . En general, la inclusi贸n de un m贸dulo es m谩s universal, pero todav铆a hay una diferencia entre ellos.


El comando enable_testing permite realizar pruebas para el directorio actual, as铆 como para todos los posteriores. Debe ubicarse en la ra铆z CMakeLists.txt , ya que CTest espera un archivo de prueba en la ra铆z del ensamblado.


Habilitar el m贸dulo CTest configura el proyecto para la prueba usando CTest / CDash, y tambi茅n determina autom谩ticamente la opci贸n BUILD_TESTING , que acepta verdadero cuando la prueba es posible (el valor predeterminado es ON ). Por lo tanto, cuando se utiliza este comando, es razonable describir el proceso de prueba de esta manera:


 if(BUILD_TESTING) add_test(FirstTest Test 1) add_test(SecondTest Test 2) add_test(ThirdTest Test 3) #  ... endif() 

Prueba de ejecuci贸n


Una serie de comandos cmake . && cmake --build . && ctest . cmake . && cmake --build . && ctest . se ejecutan las tres pruebas. El ctest -R <RegularExpression> ejecuta un conjunto de pruebas que satisfacen una expresi贸n regular dada. Por ejemplo, el ctest -R ThirdTest ejecuta solo la tercera prueba.


Ejemplo de embalaje


Para crear un paquete de archivos fuente, bibliotecas y archivos ejecutables, solo tiene que describir la instalaci贸n de los archivos necesarios con el comando de install y luego habilitar el m贸dulo CPack el comando de 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) 

En este caso, el comando de install notifica al generador de paquetes del directorio de instalaci贸n de destino Multiply . Sin escribir comandos de instalaci贸n, la generaci贸n de paquetes no es posible.


A continuaci贸n se enumeran las caracter铆sticas del paquete estableciendo varias variables. De hecho, hay muchas variables de este tipo que empaquetan correctamente los paquetes. La mayor铆a de ellos son opcionales, pero algunos generadores de paquetes requieren su definici贸n. Una lista de variables comunes a todos los generadores de paquetes est谩 disponible aqu铆 .


La definici贸n de la variable CPACK_GENERATOR es CPACK_GENERATOR : es una lista de generadores de paquetes invocados por la utilidad cpack . En este caso, toma el valor DEB , por lo tanto, se genera un paquete debian en el directorio ra铆z de la aplicaci贸n de resumen.


Finalmente, el m贸dulo CPack est谩 CPack , configurando el futuro paquete del proyecto utilizando las variables previamente definidas y el comando de instalaci贸n para el archivo ejecutable, adem谩s de agregar dos objetivos de ensamblaje: package y package_source (ensamblaje binario y ensamblaje de origen, respectivamente).


Ejecuci贸n de embalaje


Una serie de comandos cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package inicia para ejecutar el generador seleccionado para crear un paquete binario y 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 genera un paquete fuente directamente en el directorio ra铆z.


Finalizaci贸n


En este punto, la serie completa de tutoriales CMake ha terminado. Espero que hayas aprendido mucho material 煤til y que hayas mejorado tus habilidades de programaci贸n. Buena suerte

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


All Articles