CMake: how to change compiler for individual target

后端 未结 3 720
庸人自扰
庸人自扰 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:39

    There is no proper way to change compiler for individual target.

    According to cmake manual "Once set, you can not change this variable". This is about CMAKE_<LANG>_COMPILER.

    The solution suggested by AnthonyD973 does not seem to work, which is sad of course. The ability to use several compilers in a project without custom_command things is very useful.

    0 讨论(0)
  • 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`).
    
    0 讨论(0)
  • 2021-02-04 04:49

    CMake is a make file generator. It generates a file that you can then use to build. If you want to more than one target platform, you need to run CMake multiple times with different generators.

    So what you want to do is not possible in CMake, but with CMake: You can create a shell script that invokes CMake multiple times.

    0 讨论(0)
提交回复
热议问题