You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.0 KiB
150 lines
4.0 KiB
# Copyright (c) 2025 IAR Systems AB |
|
# |
|
# SPDX-License-Identifier: Apache-2.0 |
|
|
|
# Avoids running the linker during try_compile() |
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) |
|
set(NO_BUILD_TYPE_WARNING 1) |
|
set(CMAKE_NOT_USING_CONFIG_FLAGS 1) |
|
|
|
find_program(CMAKE_C_COMPILER |
|
NAMES ${IAR_COMPILER} |
|
PATHS ${TOOLCHAIN_HOME} |
|
PATH_SUFFIXES bin |
|
NO_DEFAULT_PATH |
|
REQUIRED ) |
|
|
|
message(STATUS "Found C Compiler ${CMAKE_C_COMPILER}") |
|
|
|
find_program(CMAKE_CXX_COMPILER |
|
NAMES ${IAR_COMPILER} |
|
PATHS ${TOOLCHAIN_HOME} |
|
PATH_SUFFIXES bin |
|
NO_DEFAULT_PATH |
|
REQUIRED ) |
|
|
|
find_program(CMAKE_AR |
|
NAMES iarchive |
|
PATHS ${TOOLCHAIN_HOME} |
|
PATH_SUFFIXES bin |
|
NO_DEFAULT_PATH |
|
REQUIRED ) |
|
|
|
set(CMAKE_ASM_COMPILER) |
|
if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") |
|
find_program(CMAKE_ASM_COMPILER |
|
arm-zephyr-eabi-gcc |
|
PATHS ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin |
|
NO_DEFAULT_PATH ) |
|
else() |
|
find_program(CMAKE_ASM_COMPILER |
|
riscv64-zephyr-elf-gcc |
|
PATHS ${ZEPHYR_SDK_INSTALL_DIR}/riscv64-zephyr-elf/bin |
|
NO_DEFAULT_PATH ) |
|
endif() |
|
|
|
message(STATUS "Found assembler ${CMAKE_ASM_COMPILER}") |
|
|
|
set(ICC_BASE ${ZEPHYR_BASE}/cmake/compiler/iar) |
|
|
|
|
|
if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") |
|
# Used for settings correct cpu/fpu option for gnu assembler |
|
include(${ZEPHYR_BASE}/cmake/gcc-m-cpu.cmake) |
|
include(${ZEPHYR_BASE}/cmake/gcc-m-fpu.cmake) |
|
|
|
# Map KConfig option to icc cpu/fpu |
|
include(${ICC_BASE}/iccarm-cpu.cmake) |
|
include(${ICC_BASE}/iccarm-fpu.cmake) |
|
endif() |
|
|
|
set(IAR_COMMON_FLAGS) |
|
# Minimal C compiler flags |
|
|
|
list(APPEND IAR_COMMON_FLAGS |
|
"SHELL: --preinclude" |
|
"${ZEPHYR_BASE}/include/zephyr/toolchain/iar/iar_missing_defs.h" |
|
# Enable both IAR and GNU extensions |
|
-e |
|
--language gnu |
|
--do_explicit_init_in_named_sections |
|
--macro_positions_in_diagnostics |
|
--no_wrap_diagnostics |
|
) |
|
|
|
if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") |
|
list(APPEND IAR_COMMON_FLAGS |
|
--endian=little |
|
--cpu=${ICCARM_CPU} |
|
-DRTT_USE_ASM=0 # WA for VAAK-232 |
|
--diag_suppress=Ta184 # Using zero sized arrays except for as last |
|
# member of a struct is discouraged and |
|
# dereferencing elements in such an array has |
|
# undefined behavior |
|
) |
|
endif() |
|
|
|
# Enable VLA if CONFIG_MISRA_SANE is not set and warnings are not enabled. |
|
if(NOT CONFIG_MISRA_SANE AND NOT DEFINED W) |
|
list(APPEND IAR_COMMON_FLAGS --vla) |
|
endif() |
|
|
|
# Minimal ASM compiler flags |
|
if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") |
|
list(APPEND IAR_ASM_FLAGS |
|
-mcpu=${GCC_M_CPU} |
|
-mabi=aapcs |
|
-DRTT_USE_ASM=0 #WA for VAAK-232 |
|
) |
|
endif() |
|
|
|
# IAR needs Dwarf 4 output |
|
list(APPEND IAR_ASM_FLAGS -gdwarf-4) |
|
|
|
if(DEFINED CONFIG_ARM_SECURE_FIRMWARE) |
|
list(APPEND IAR_COMMON_FLAGS --cmse) |
|
list(APPEND IAR_ASM_FLAGS -mcmse) |
|
endif() |
|
|
|
# 64-bit |
|
if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") |
|
if(CONFIG_ARM64) |
|
list(APPEND IAR_COMMON_FLAGS --abi=lp64) |
|
list(APPEND TOOLCHAIN_LD_FLAGS --abi=lp64) |
|
# 32-bit |
|
else() |
|
list(APPEND IAR_COMMON_FLAGS --aeabi) |
|
if(CONFIG_COMPILER_ISA_THUMB2) |
|
list(APPEND IAR_COMMON_FLAGS --thumb) |
|
list(APPEND IAR_ASM_FLAGS -mthumb) |
|
endif() |
|
|
|
if(CONFIG_FPU) |
|
list(APPEND IAR_COMMON_FLAGS --fpu=${ICCARM_FPU}) |
|
list(APPEND IAR_ASM_FLAGS -mfpu=${GCC_M_FPU}) |
|
endif() |
|
endif() |
|
|
|
if(CONFIG_IAR_LIBC) |
|
# Zephyr requires AEABI portability to ensure correct functioning of the C |
|
# library, for example error numbers, errno.h. |
|
list(APPEND IAR_COMMON_FLAGS -D__AEABI_PORTABILITY_LEVEL=1) |
|
endif() |
|
endif() |
|
|
|
if(CONFIG_IAR_LIBC) |
|
message(STATUS "IAR C library used") |
|
# Zephyr uses the type FILE for normal LIBC while IAR |
|
# only has it for full LIBC support, so always choose |
|
# full libc when using IAR C libraries. |
|
list(APPEND IAR_COMMON_FLAGS --dlib_config full) |
|
endif() |
|
|
|
foreach(F ${IAR_COMMON_FLAGS}) |
|
list(APPEND TOOLCHAIN_C_FLAGS $<$<COMPILE_LANGUAGE:C>:${F}>) |
|
list(APPEND TOOLCHAIN_C_FLAGS $<$<COMPILE_LANGUAGE:CXX>:${F}>) |
|
endforeach() |
|
|
|
foreach(F ${IAR_ASM_FLAGS}) |
|
list(APPEND TOOLCHAIN_C_FLAGS $<$<COMPILE_LANGUAGE:ASM>:${F}>) |
|
endforeach()
|
|
|