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