cmake cross-compiling

Cómo indicar a CMake que use el compilador de arquitectura de compilación



cross-compiling (1)

CMake solo puede manejar un compilador a la vez. Entonces, si no hace un largo camino para configurar el otro compilador como un nuevo idioma, terminará con dos ciclos de configuración.

Veo los siguientes enfoques para automatizar este proceso:

  1. Tomando el ejemplo "CMake Cross Compiling - ¿Usando ejecutables en la compilación creada durante la compilación?" de las páginas de CMake como punto de partida obtendré:

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.0) project(FooBarTest) # When crosscompiling import the executable targets if (CMAKE_CROSSCOMPILING) set(IMPORT_PATH "IMPORTFILE-NOTFOUND" CACHE FILEPATH "Point it to the export file path from a native build") file(TO_CMAKE_PATH "${IMPORT_PATH}" IMPORT_PATH_CMAKE) include(${IMPORT_PATH_CMAKE}/genfooTargets.cmake) # Then use the target name as COMMAND, CMake >= 2.6 knows how to handle this add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h COMMAND genfoo ) add_executable(bar bar.cpp ${CMAKE_CURRENT_BINARY_DIR}/foo.h) target_include_directories(bar PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) endif() # Only build the generator if not crosscompiling if (NOT CMAKE_CROSSCOMPILING) add_executable(genfoo genfoo.cpp) export(TARGETS genfoo FILE "${CMAKE_CURRENT_BINARY_DIR}/genfooTargets.cmake") endif()

    Luego usando un script como:

    build.sh

    #!/bin/bash if [ ! -d hostBuild ]; then cmake -E make_directory hostBuild cmake -E chdir hostBuild cmake .. fi cmake --build hostBuild if [ ! -d crossBuild ]; then cmake -E make_directory crossBuild cmake -E chdir crossBuild cmake .. -DIMPORT_PATH=${PWD}/hostBuild -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake fi cmake --build crossBuild

    ./build.sh resultados deseados llamando a ./build.sh .

  2. Dividir CMakeLists.txt y quizás incluso reemplazar export() / include() con algo donde conozco la ruta de salida de mis herramientas de compilación, por ejemplo, usando CMAKE_RUNTIME_OUTPUT_DIRECTORY simplificaría las cosas:

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.0) project(FooBarTest) # Then use the target name as COMMAND. CMake >= 2.6 knows how to handle this add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h COMMAND genfoo ) add_executable(bar bar.cpp ${CMAKE_CURRENT_BINARY_DIR}/foo.h) target_include_directories(bar PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

    buildTools / CMakeLists.txt

    cmake_minimum_required(VERSION 3.0) project(BuildTools) add_executable(genfoo genfoo.cpp)

    build.sh

    #!/bin/bash if [ ! -d crossBuild ]; then cmake -E make_directory crossBuild cmake -E chdir crossBuild cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake fi if [ ! -d hostBuild ]; then cmake -E make_directory hostBuild cmake -E chdir hostBuild cmake ../buildTools -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${PWD}/crossBuild fi cmake --build hostBuild cmake --build crossBuild

Referencias

Cuando se usa CMake para la compilación cruzada, generalmente se especifica un archivo de cadena de herramientas a través de la opción CMAKE_TOOLCHAIN_FILE . En la terminología de GNU , se puede especificar el conjunto de herramientas de arquitectura de host utilizando este archivo. Sin embargo, generalmente no se puede esperar poder ejecutar nada creado con esta cadena de herramientas. Muy a menudo, algunas herramientas de compilación deben compilarse para la arquitectura de compilación.

Considere la siguiente configuración. Tengo dos archivos fuente genfoo.c y bar.c Durante la compilación, genfoo.c necesita compilarse y ejecutarse. Su salida debe escribirse en foo.h Entonces puedo compilar bar.c , que #include "foo.h" . Dado que CMake usa de manera predeterminada la cadena de herramientas de arquitectura de host, las instrucciones para bar.c son fáciles. Pero, ¿cómo le digo que use la cadena de herramientas de arquitectura de compilación para compilar genfoo.c ? Simplemente decir add_executable(genfoo genfoo.c) dará como resultado el uso del compilador incorrecto.