CMake: как сменить компилятор для отдельной цели

У меня есть встроенный проект с использованием кросс-компилятора. Я хотел бы представить тест Google, скомпилированный с помощью собственного компилятора GCC. Кроме того, создайте несколько unit test целей с помощью CTC-компилятора.

Коротко:
У меня есть 3 разных цели и скомпилировать их с тремя разными компиляторами. Как выразить это в CMakeLists.txt? Я пробовал SET_TARGET_PROPERTIES;
но невозможно установить CXX variable с помощью этой команды!

Ответ 1

У меня была такая же проблема прямо сейчас, но другой ответ мне не помог. Я также выполняю кросс-компиляцию, и мне нужны некоторые утилиты для компиляции с GCC, но мой основной код компилируется с помощью avr-gcc.

В принципе, если у вас есть CMakeLists.txt, и вы хотите, чтобы все цели в этом файле были скомпилированы с другим компилятором, вы можете просто установить переменные вручную.

Определите эти макросы где-нибудь:

macro(use_host_compiler)
  if (${CURRENT_COMPILER} STREQUAL "NATIVE")
    # Save current native flags
    set(NATIVE_C_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "GCC flags for the native compiler." FORCE)

    # Change compiler
    set(CMAKE_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME})
    set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
    set(CMAKE_C_COMPILER ${HOST_C_COMPILER})
    set(CMAKE_C_FLAGS ${HOST_C_FLAGS})
    set(CURRENT_COMPILER "HOST" CACHE STRING "Which compiler we are using." FORCE)
  endif()
endmacro()


macro(use_native_compiler)
  if (CMAKE_CROSSCOMPILING AND ${CURRENT_COMPILER} STREQUAL "HOST")
    # Save current host flags
    set(HOST_C_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "GCC flags for the host compiler." FORCE)

    # Change compiler
    set(CMAKE_SYSTEM_NAME ${NATIVE_SYSTEM_NAME})
    set(CMAKE_SYSTEM_PROCESSOR ${NATIVE_SYSTEM_PROCESSOR})
    set(CMAKE_C_COMPILER ${NATIVE_C_COMPILER})
    set(CMAKE_C_FLAGS ${NATIVE_C_FLAGS})
    set(CURRENT_COMPILER "NATIVE" CACHE STRING "Which compiler we are using." FORCE)
  endif()
endmacro()

В самом начале вашего CMakeLists.txt script (или в файле toolchain) установите следующие переменные в соответствии с тем, что вам нужно:

  • CURRENT_COMPILER
  • HOST_C_COMPILER
  • HOST_C_FLAGS
  • NATIVE_SYSTEM_NAME
  • NATIVE_C_COMPILER
  • NATIVE_C_FLAGS

Идея заключается в том, что CMAKE_C_COMPILER (и компания) - это переменная, как и любая другая, поэтому ее настройка внутри определенной области может оставить ее измененной в пределах этой области.


Использование примера:

use_host_compiler()
add_executable(foo foo.c) # Compiled with your host (computer) compiler.
use_native_compiler()
add_executable(bar bar.c) # Compiled with your native compiler (e.g. `avr-gcc`).

Ответ 2

Не существует правильного способа изменить компилятор для отдельной цели.

Согласно руководству cmake "После установки вы не можете изменить эту переменную". Это о CMAKE__COMPILER.

Решение, предложенное AnthonyD973, похоже, не работает, что, конечно, печально. Возможность использовать несколько компиляторов в проекте без вещей custom_command очень полезна.

Ответ 3

CMake - это генератор файла make. Он генерирует файл, который затем можно использовать для сборки. Если вы хотите использовать более одной целевой платформы, вам нужно запустить CMake несколько раз с разными генераторами.

То, что вы хотите сделать, невозможно в CMake, но с CMake: вы можете создать оболочку script, которая несколько раз запускает CMake.