CMake: how to change compiler for individual target

后端 未结 3 719
庸人自扰
庸人自扰 2021-02-04 04:14

I have embedded project using cross compiler. I would like to introduce Google test, compiled with native GCC compiler. Additionally build some unit test targets with CTC compil

3条回答
  •  醉话见心
    2021-02-04 04:42

    I just had the same issue right now, but the other answer didn't help me. I'm also cross-compiling, and I need some utility programs to be compiled with GCC, but my core code to be compiled with avr-gcc.

    Basically, if you have a CMakeLists.txt, and you want all targets in this file to be compiled with another compiler, you can just set the variables by hand.

    Define these macros somewhere:

    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()
    

    At the very beginning of your CMakeLists.txt script (or in a toolchain file), set the following variables according to what you need:

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

    The idea is that CMAKE_C_COMPILER (and company) is a variable like any other, so setting it inside a certain scope will only leave it changed within that scope.


    Example usage:

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

提交回复
热议问题