1# Copyright (c) 2025 IAR Systems AB 2# 3# SPDX-License-Identifier: Apache-2.0 4 5# Avoids running the linker during try_compile() 6set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 7set(NO_BUILD_TYPE_WARNING 1) 8set(CMAKE_NOT_USING_CONFIG_FLAGS 1) 9 10find_program(CMAKE_C_COMPILER 11 NAMES ${IAR_COMPILER} 12 PATHS ${TOOLCHAIN_HOME} 13 PATH_SUFFIXES bin 14 NO_DEFAULT_PATH 15 REQUIRED ) 16 17message(STATUS "Found C Compiler ${CMAKE_C_COMPILER}") 18 19find_program(CMAKE_CXX_COMPILER 20 NAMES ${IAR_COMPILER} 21 PATHS ${TOOLCHAIN_HOME} 22 PATH_SUFFIXES bin 23 NO_DEFAULT_PATH 24 REQUIRED ) 25 26find_program(CMAKE_AR 27 NAMES iarchive 28 PATHS ${TOOLCHAIN_HOME} 29 PATH_SUFFIXES bin 30 NO_DEFAULT_PATH 31 REQUIRED ) 32 33set(CMAKE_ASM_COMPILER) 34if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") 35 find_program(CMAKE_ASM_COMPILER 36 arm-zephyr-eabi-gcc 37 PATHS ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin 38 NO_DEFAULT_PATH ) 39else() 40 find_program(CMAKE_ASM_COMPILER 41 riscv64-zephyr-elf-gcc 42 PATHS ${ZEPHYR_SDK_INSTALL_DIR}/riscv64-zephyr-elf/bin 43 NO_DEFAULT_PATH ) 44endif() 45 46message(STATUS "Found assembler ${CMAKE_ASM_COMPILER}") 47 48set(ICC_BASE ${ZEPHYR_BASE}/cmake/compiler/iar) 49 50 51if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") 52 # Used for settings correct cpu/fpu option for gnu assembler 53 include(${ZEPHYR_BASE}/cmake/gcc-m-cpu.cmake) 54 include(${ZEPHYR_BASE}/cmake/gcc-m-fpu.cmake) 55 56 # Map KConfig option to icc cpu/fpu 57 include(${ICC_BASE}/iccarm-cpu.cmake) 58 include(${ICC_BASE}/iccarm-fpu.cmake) 59endif() 60 61set(IAR_COMMON_FLAGS) 62# Minimal C compiler flags 63 64list(APPEND IAR_COMMON_FLAGS 65 "SHELL: --preinclude" 66 "${ZEPHYR_BASE}/include/zephyr/toolchain/iar/iar_missing_defs.h" 67 # Enable both IAR and GNU extensions 68 -e 69 --language gnu 70 --do_explicit_init_in_named_sections 71 --macro_positions_in_diagnostics 72 --no_wrap_diagnostics 73) 74 75if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") 76 list(APPEND IAR_COMMON_FLAGS 77 --endian=little 78 --cpu=${ICCARM_CPU} 79 -DRTT_USE_ASM=0 # WA for VAAK-232 80 --diag_suppress=Ta184 # Using zero sized arrays except for as last 81 # member of a struct is discouraged and 82 # dereferencing elements in such an array has 83 # undefined behavior 84 ) 85endif() 86 87# Enable VLA if CONFIG_MISRA_SANE is not set and warnings are not enabled. 88if(NOT CONFIG_MISRA_SANE AND NOT DEFINED W) 89 list(APPEND IAR_COMMON_FLAGS $<$<COMPILE_LANGUAGE:C>:--vla>) 90endif() 91 92# Minimal ASM compiler flags 93if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") 94 list(APPEND IAR_ASM_FLAGS 95 -mcpu=${GCC_M_CPU} 96 -mabi=aapcs 97 -DRTT_USE_ASM=0 #WA for VAAK-232 98 ) 99endif() 100 101# IAR needs Dwarf 4 output 102list(APPEND IAR_ASM_FLAGS -gdwarf-4) 103 104if(DEFINED CONFIG_ARM_SECURE_FIRMWARE) 105 list(APPEND IAR_COMMON_FLAGS --cmse) 106 list(APPEND IAR_ASM_FLAGS -mcmse) 107endif() 108 109# 64-bit 110if("${IAR_TOOLCHAIN_VARIANT}" STREQUAL "iccarm") 111 if(CONFIG_ARM64) 112 list(APPEND IAR_COMMON_FLAGS --abi=lp64) 113 list(APPEND TOOLCHAIN_LD_FLAGS --abi=lp64) 114 # 32-bit 115 else() 116 list(APPEND IAR_COMMON_FLAGS --aeabi) 117 if(CONFIG_COMPILER_ISA_THUMB2) 118 list(APPEND IAR_COMMON_FLAGS --thumb) 119 list(APPEND IAR_ASM_FLAGS -mthumb) 120 endif() 121 122 if(CONFIG_FPU) 123 list(APPEND IAR_COMMON_FLAGS --fpu=${ICCARM_FPU}) 124 list(APPEND IAR_ASM_FLAGS -mfpu=${GCC_M_FPU}) 125 endif() 126 endif() 127 128 if(CONFIG_IAR_LIBC) 129 # Zephyr requires AEABI portability to ensure correct functioning of the C 130 # library, for example error numbers, errno.h. 131 list(APPEND IAR_COMMON_FLAGS -D__AEABI_PORTABILITY_LEVEL=1) 132 endif() 133endif() 134 135if(CONFIG_IAR_LIBC) 136 message(STATUS "IAR C library used") 137 # Zephyr uses the type FILE for normal LIBC while IAR 138 # only has it for full LIBC support, so always choose 139 # full libc when using IAR C libraries. 140 list(APPEND IAR_COMMON_FLAGS --dlib_config full) 141endif() 142 143foreach(F ${IAR_COMMON_FLAGS}) 144 list(APPEND TOOLCHAIN_C_FLAGS $<$<COMPILE_LANGUAGE:C>:${F}>) 145 list(APPEND TOOLCHAIN_C_FLAGS $<$<COMPILE_LANGUAGE:CXX>:${F}>) 146endforeach() 147 148foreach(F ${IAR_ASM_FLAGS}) 149 list(APPEND TOOLCHAIN_C_FLAGS $<$<COMPILE_LANGUAGE:ASM>:${F}>) 150endforeach() 151