versiones guia español actualizar build cmake cross-compiling ninja

build - guia - qgis español



cmake-compilar de forma nativa y hacer una copia cruzada del mismo código (1)

Estamos escribiendo una aplicación para un dispositivo ARM / Linux integrado. El desarrollo se realiza en una PC con Windows, utilizando un crosscompiler, Eclipse y Ninja. Cmake actualmente puede crear scripts de compilación que funcionen bien para el propósito previsto.

Tenemos pruebas unitarias que se ejecutan en el dispositivo incrustado conectado a la red, una vez que el proyecto se envía (sobre git) al servidor.

Estamos tratando de implementar pruebas unitarias, que se ejecutarían en la PC, antes de probarlas en el dispositivo. Eso significa construir de forma nativa, usando MinGW gcc; por supuesto, no podemos ejecutar los ejecutables de ARM Linux en la PC.

Incluso si cambiamos la cadena de herramientas, lanzamos cmake para reconstruir el conjunto de reglas para Ninja o creamos dos directorios de compilación, uno para PC y otro para ARM, el problema es que CMake intentará ejecutar un ejecutable de prueba y luego durante la compilación, pruebas unitarias se intentará en la construcción de ARM.

¿Cómo podemos configurar las compilaciones (a través de cmake) para crear ambas y no intentar ejecutar las compiladas cruzadas en la PC?


Convertir mis comentarios en una respuesta

Tengo una configuración similar en mis proyectos (construyendo a partir de las mismas fuentes un simulador, pruebas unitarias y el binario objetivo) y puede buscar CMAKE_CROSSCOMPILING para diferenciar sus dos casos de uso. Solo poniendo

if (NOT CMAKE_CROSSCOMPILING) .... endif()

alrededor de los comandos particulares deberían hacer el truco.

Y necesita tener dos directorios de salida binarios. CMake no permite mezclar cadenas de herramientas en un directorio.

Pero no necesita tener dos proyectos IDE. En mis proyectos:

  • He agregado todas las fuentes, incl. los archivos "solo compilación cruzada" - en los objetivos de biblioteca / ejecutable
    • Los estoy marcando como "excluidos de compilación" solo para PC.
    • Entonces, todas las fuentes se mostrarán en un proyecto IDE (por ejemplo, para buscar a través del código)
  • He agregado la llamada de compilación cruzada como un objetivo personalizado
    • Lo eliminé de la compilación predeterminada, pero puedes iniciarlo explícitamente desde tu IDE
    • En mi caso, es un script externo, pero también puede pasar las llamadas necesarias directamente en los parámetros COMMAND
    • Incluso podría usar otro ExternalProject_Add() para incluir su propio proyecto para la compilación cruzada

Aquí hay algunos fragmentos de código para este tipo de enfoque:

if (NOT CMAKE_CROSSCOMPILING) set(PC "ON" CACHE INTERNAL "hw-platform PC") unset(MCU CACHE) else() set(MCU "ON" CACHE INTERNAL "hw-platform MCU") unset(PC CACHE) endif() ... if (PC) # Exclude files that only compile/work on MCU set_source_files_properties(... PROPERTIES HEADER_FILE_ONLY 1) endif() ... if (PC) add_test(...) endif() ... if (PC AND EXISTS "${CMAKE_SOURCE_DIR}/buildMcu.cmd") add_custom_target( BUILD_MCU COMMAND buildMcu.cmd WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) set_target_properties(BUILD_MCU PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1) endif()

Referencias