cmake/toolchain/Clang.cmake (72 lines of code) (raw):
# ++
#
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT license.
#
# Module Name:
#
# Clang.cmake
#
# Abstract:
#
# Clang Toolchain file
#
# --
include(${CMAKE_CURRENT_LIST_DIR}/ToolchainDefaults.cmake)
#
# Register the toolchain with CMake.
#
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang${TOOLCHAIN_VERSION})
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++${TOOLCHAIN_VERSION})
set(CMAKE_AR ${TOOLCHAIN_PREFIX}llvm-ar${TOOLCHAIN_VERSION})
set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld.lld${TOOLCHAIN_VERSION})
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}llvm-objcopy${TOOLCHAIN_VERSION})
set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}llvm-objdump${TOOLCHAIN_VERSION})
set(CMAKE_SIZE_UTIL ${TOOLCHAIN_PREFIX}size${TOOLCHAIN_VERSION})
set(CLANG_FORMAT ${TOOLCHAIN_PREFIX}clang-format${TOOLCHAIN_VERSION})
#
# Set the default compiler flags.
# https://clang.llvm.org/docs/UsersManual.html#id9
#
add_compile_options(
${CERBERUS_MCU_FLAGS}
-std=c2x # use c20 standard. Default is c17
-c # compile the file
-fdata-sections # which is really useful when we have to figure out what is in each region
-fdiagnostics-color=always # Show colorized output
-ffunction-sections # These switches puts the func/data in their own section
-fno-common # Do not put uninitialized section in COMMON, instead add it to bss
-fstack-protector-all # buffer overflow checks for all functions
-g # generate debugging information
-Wall # Enable all warnings
-Wextra # Enable extra warnings
-Werror # all warnings are errors
)
#
# Set the default linker flags.
#
add_link_options(
${CERBERUS_MCU_LINK_FLAGS}
--gc-sections
)
set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
#
# Use LLVM lld linker
#
set(LLVM_ENABLE_PROJECTS lld)
#
# Disable compiler checks
#
set(CMAKE_C_COMPILER_FORCED TRUE)
set(CMAKE_CXX_COMPILER_FORCED TRUE)
#
# Don't look for executable in target system prefix.
#
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#
# Look for includes and libraries only in the target system prefix.
#
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)