summaryrefslogtreecommitdiff
path: root/Modules/CMakeFindBinUtils.cmake
diff options
context:
space:
mode:
authorJean-Marc Hengen <jean-marc.hengen@zuehlke.com>2021-07-19 23:14:29 +0200
committerJean-Marc Hengen <jean-marc.hengen@zuehlke.com>2021-07-23 14:34:26 +0200
commit5b9bfe738cfa96ca12ca82506f234aae787965e9 (patch)
treef2799bb70661b3d9b067047c5410fde3b58f1c01 /Modules/CMakeFindBinUtils.cmake
parent31ecd3718047874b5eeb939e9608fa1bd386c1a7 (diff)
downloadcmake-5b9bfe738cfa96ca12ca82506f234aae787965e9.tar.gz
IAR: Moved search logic to BinUtils.
The search logic for the IAR linker, librarian and related tools is moved from `Modules/Compiler/IAR-FindBinUtils.cmake` to `Modules/CMakeFindBinUtils.cmake` by introducing an new elseif block for the IAR toolchain. The search logic was refactored to omit repeating itself. Fixes: #22425
Diffstat (limited to 'Modules/CMakeFindBinUtils.cmake')
-rw-r--r--Modules/CMakeFindBinUtils.cmake54
1 files changed, 54 insertions, 0 deletions
diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake
index 3162ec57fa..f139ff4826 100644
--- a/Modules/CMakeFindBinUtils.cmake
+++ b/Modules/CMakeFindBinUtils.cmake
@@ -94,6 +94,53 @@ elseif("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" MATCHES "^x(Open)?W
set(_CMAKE_AR_NAMES "wlib")
list(APPEND _CMAKE_TOOL_VARS LINKER AR)
+elseif("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" MATCHES "^xIAR$")
+ # Small helper declaring an IAR tool (e.g. linker) to avoid repeating the same idiom every time
+ macro(__append_IAR_tool TOOL_VAR NAME)
+ set(_CMAKE_${TOOL_VAR}_NAMES "${NAME}" "${NAME}.exe")
+ list(APPEND _CMAKE_TOOL_VARS ${TOOL_VAR})
+ endmacro()
+
+ # Resolve hint path from an IAR compiler
+ function(__resolve_IAR_hints COMPILER RESULT)
+ get_filename_component(_CMAKE_IAR_HINT "${COMPILER}" REALPATH)
+ get_filename_component(_CMAKE_IAR_HINT "${_CMAKE_IAR_HINT}" DIRECTORY)
+ list(APPEND _IAR_HINTS "${_CMAKE_IAR_HINT}")
+
+ get_filename_component(_CMAKE_IAR_HINT "${COMPILER}" DIRECTORY)
+ list(APPEND _IAR_HINTS "${_CMAKE_IAR_HINT}")
+
+ set(${RESULT} "${_IAR_HINTS}" PARENT_SCOPE)
+ endfunction()
+
+ __resolve_IAR_hints("${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER}" _CMAKE_TOOLCHAIN_LOCATION)
+ set(_CMAKE_IAR_ITOOLS "ARM" "RX" "RH850" "RL78" "RISCV" "STM8")
+ set(_CMAKE_IAR_XTOOLS "AVR" "MSP430" "V850" "8051")
+
+ if("${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ARCHITECTURE_ID}" IN_LIST _CMAKE_IAR_ITOOLS)
+ string(TOLOWER "${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ARCHITECTURE_ID}" _CMAKE_IAR_LOWER_ARCHITECTURE_ID)
+
+ __append_IAR_tool(AR "iarchive")
+ __append_IAR_tool(LINKER "ilink${_CMAKE_IAR_LOWER_ARCHITECTURE_ID}")
+
+ __append_IAR_tool(IAR_ELFDUMP "ielfdump${_CMAKE_IAR_LOWER_ARCHITECTURE_ID}")
+ __append_IAR_tool(IAR_ELFTOOL "ielftool")
+ __append_IAR_tool(IAR_OBJMANIP "iobjmanip")
+ __append_IAR_tool(IAR_SYMEXPORT "isymexport")
+
+ unset(_CMAKE_IAR_LOWER_ARCHITECTURE_ID)
+
+ elseif("${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ARCHITECTURE_ID}" IN_LIST _CMAKE_IAR_XTOOLS)
+ __append_IAR_tool(AR "xar")
+ __append_IAR_tool(LINKER "xlink")
+
+ else()
+ message(FATAL_ERROR "Failed to find linker and librarian for ${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID} on ${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ARCHITECTURE_ID}.")
+ endif()
+
+ unset(_CMAKE_IAR_ITOOLS)
+ unset(_CMAKE_IAR_XTOOLS)
+
# in all other cases search for ar, ranlib, etc.
else()
if(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN)
@@ -186,3 +233,10 @@ unset(_CMAKE_TOOL_VARS)
unset(_CMAKE_TOOL_CACHED)
unset(_CMAKE_TOOL_NAME)
unset(_CMAKE_TOOL)
+
+if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" MATCHES "^xIAR$")
+ # Set for backwards compatibility
+ set(CMAKE_IAR_ARCHIVE "${CMAKE_AR}" CACHE FILEPATH "The IAR archiver")
+ set(CMAKE_IAR_LINKER "${CMAKE_LINKER}" CACHE FILEPATH "The IAR ILINK linker")
+ mark_as_advanced(CMAKE_IAR_LINKER CMAKE_IAR_AR)
+endif()