Skip to content

Commit 19288c6

Browse files
Add support for Microchip XC32 toolchain in the CMSIS toolbox
1 parent 93ce883 commit 19288c6

File tree

2 files changed

+134
-1
lines changed

2 files changed

+134
-1
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# This file maps the CMSIS project options to toolchain settings.
2+
#
3+
# - Applies to toolchain: Microchip XC32 Compiler version 5.0.0 and greater
4+
5+
set(AS "xc32-gcc")
6+
set(CC "xc32-gcc")
7+
set(CPP "xc32-gcc")
8+
set(CXX "xc32-g++")
9+
set(OC "xc32-objcopy")
10+
11+
set(TOOLCHAIN_ROOT "${REGISTERED_TOOLCHAIN_ROOT}")
12+
set(TOOLCHAIN_VERSION "${REGISTERED_TOOLCHAIN_VERSION}")
13+
14+
if(DEFINED TOOLCHAIN_ROOT)
15+
set(PREFIX)
16+
set(EXT)
17+
18+
set(AS ${TOOLCHAIN_ROOT}/${PREFIX}${AS}${EXT})
19+
set(CC ${TOOLCHAIN_ROOT}/${PREFIX}${CC}${EXT})
20+
set(CPP ${TOOLCHAIN_ROOT}/${PREFIX}${CPP}${EXT})
21+
set(CXX ${TOOLCHAIN_ROOT}/${PREFIX}${CXX}${EXT})
22+
set(OC ${TOOLCHAIN_ROOT}/${PREFIX}${OC}${EXT})
23+
endif()
24+
25+
# Environment variables
26+
27+
if(NOT DEFINED ENV{DEVICE_ID})
28+
message(FATAL_ERROR "Environment variable DEVICE_ID not defined!")
29+
endif()
30+
31+
if(NOT DEFINED ENV{DFP_PATH})
32+
message(FATAL_ERROR "Environment variable DFP_PATH not defined!")
33+
endif()
34+
35+
set(DEVICE_ID $ENV{DEVICE_ID})
36+
set(DFP_PATH $ENV{DFP_PATH})
37+
set(LINKER_SCRIPT "${DFP_PATH}/xc32/${DEVICE_ID}/${DEVICE_ID}.ld")
38+
39+
# Helpers
40+
41+
function(cbuild_set_option_flags lang option value flags)
42+
if(NOT DEFINED ${option}_${lang}_FLAGS)
43+
return()
44+
endif()
45+
list(FIND ${option}_VALUES "${value}" _index)
46+
if (${_index} GREATER -1)
47+
list(GET ${option}_${lang}_FLAGS ${_index} flag)
48+
if(NOT flag STREQUAL "")
49+
string(STRIP "${flag} ${${flags}}" ${flags})
50+
set(${flags} "${${flags}}" PARENT_SCOPE)
51+
endif()
52+
elseif(NOT value STREQUAL "")
53+
string(TOLOWER "${option}" _option)
54+
message(FATAL_ERROR "unkown '${_option}' value '${value}' !")
55+
endif()
56+
endfunction()
57+
58+
function(cbuild_set_options_flags lang optimize debug warnings language flags)
59+
set(tmp "")
60+
cbuild_set_option_flags(${lang} OPTIMIZE "${optimize}" tmp)
61+
cbuild_set_option_flags(${lang} DEBUG "${debug}" tmp)
62+
cbuild_set_option_flags(${lang} WARNINGS "${warnings}" tmp)
63+
if(lang STREQUAL "CC" OR lang STREQUAL "CXX")
64+
cbuild_set_option_flags(${lang} LANGUAGE "${language}" tmp)
65+
endif()
66+
set(${flags} "${tmp}" PARENT_SCOPE)
67+
endfunction()
68+
69+
70+
set(OPTIMIZE_VALUES "debug" "none" "balanced" "size" "speed" "minimal")
71+
set(OPTIMIZE_CC_FLAGS "-Og" "-O0" "-O2" "-Os" "-O3" "-O1")
72+
set(OPTIMIZE_CXX_FLAGS ${OPTIMIZE_CC_FLAGS})
73+
set(OPTIMIZE_LD_FLAGS ${OPTIMIZE_CC_FLAGS})
74+
set(OPTIMIZE_ASM_FLAGS ${OPTIMIZE_CC_FLAGS})
75+
76+
set(DEBUG_VALUES "on" "off")
77+
set(DEBUG_CC_FLAGS "-g" "")
78+
set(DEBUG_CXX_FLAGS       "-g"    "")
79+
set(DEBUG_LD_FLAGS        "-g"    "")
80+
set(DEBUG_ASM_FLAGS       "-g"    "")
81+
82+
set(WARNINGS_VALUES "on" "off" "all")
83+
set(WARNINGS_CC_FLAGS "-Wall" "-w" "-Wall -Wextra")
84+
set(WARNINGS_CXX_FLAGS "-Wall" "-w" "-Wall -Wextra")
85+
set(WARNINGS_ASM_FLAGS "-Wall" "-w" "-Wall -Wextra")
86+
set(WARNINGS_LD_FLAGS "" "" "")
87+
88+
set(LANGUAGE_VALUES "c90" "gnu90" "c99" "gnu99" "c11" "gnu11" "c++98" "gnu++98" "c++03" "gnu++03" "c++11" "gnu++11" "c++14" "gnu++14" "c++17" "gnu++17" )
89+
set(LANGUAGE_CC_FLAGS "-std=c90" "-std=gnu90" "-std=c99" "-std=gnu99" "-std=c11" "-std=gnu11" "" "" "" "" "" "" "" "" "" "" )
90+
set(LANGUAGE_CXX_FLAGS "" "" "" "" "" "" "-std=c++98" "-std=gnu++98" "-std=c++03" "-std=gnu++03" "-std=c++11" "-std=gnu++11" "-std=c++14" "-std=gnu++14" "-std=c++17" "-std=gnu++17")
91+
92+
# XC32 Processor/DFP flags
93+
set(XC32_COMMON_FLAGS "-mprocessor=${DEVICE_ID} -mdfp=${DFP_PATH}")
94+
95+
# C Compiler
96+
97+
set(CC_OPTIONS_FLAGS "")
98+
cbuild_set_options_flags(CC "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "${LANGUAGE_CC}" CC_OPTIONS_FLAGS)
99+
set(CMAKE_C_FLAGS "${XC32_COMMON_FLAGS} ${CC_OPTIONS_FLAGS}")
100+
101+
102+
# C++ Compiler
103+
104+
set(CXX_OPTIONS_FLAGS "")
105+
cbuild_set_options_flags(CXX "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "${LANGUAGE_CXX}" CXX_OPTIONS_FLAGS)
106+
set(CMAKE_CXX_FLAGS "${XC32_COMMON_FLAGS} ${CXX_OPTIONS_FLAGS}")
107+
108+
# Assembler
109+
110+
set(ASM_OPTIONS_FLAGS "")
111+
cbuild_set_options_flags(ASM "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "" ASM_OPTIONS_FLAGS)
112+
set(CMAKE_ASM_FLAGS "${XC32_COMMON_FLAGS} ${ASM_OPTIONS_FLAGS}")
113+
114+
# Linker
115+
116+
set(LD_OPTIONS_FLAGS "")
117+
cbuild_set_options_flags(LD "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "" LD_OPTIONS_FLAGS)
118+
set(CMAKE_EXE_LINKER_FLAGS "${XC32_COMMON_FLAGS} ${LD_OPTIONS_FLAGS} -T ${LINKER_SCRIPT}")
119+
120+
# ELF to HEX conversion
121+
set(ELF2HEX -O ihex "${OUT_DIR}/$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>.elf" "${OUT_DIR}/${HEX_FILE}")
122+
123+
# ELF to BIN conversion
124+
set(ELF2BIN -O binary "${OUT_DIR}/$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>.elf" "${OUT_DIR}/${BIN_FILE}")
125+
126+
# Set CMake variables for toolchain initialization
127+
set(CMAKE_SYSTEM_NAME Generic)
128+
set(CMAKE_CROSSCOMPILING TRUE)
129+
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
130+
set(CMAKE_ASM_COMPILER "${AS}")
131+
set(CMAKE_C_COMPILER "${CC}")
132+
set(CMAKE_CXX_COMPILER "${CXX}")
133+
set(CMAKE_OBJCOPY "${OC}")

tools/projmgr/schemas/common.schema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@
187187
"CompilerType": {
188188
"title":"compiler:\nDocumentation: https://open-cmsis-pack.github.io/cmsis-toolbox/YML-Input-Format/#compiler",
189189
"type": "string",
190-
"pattern": "^(GCC|CLANG|AC6|IAR|CLANG_TI)(@(>=)?([0-9]+\\.[0-9]+\\.[0-9]+((\\+|\\-)[a-zA-Z0-9_\\.\\+-]+)?))?$",
190+
"pattern": "^(GCC|CLANG|AC6|IAR|CLANG_TI|XC)(@(>=)?([0-9]+\\.[0-9]+\\.[0-9]+((\\+|\\-)[a-zA-Z0-9_\\.\\+-]+)?))?$",
191191
"description": "Compiler toolchain to be used, optionally with version, for example [email protected]."
192192
},
193193
"ConsumesProvidesType": {

0 commit comments

Comments
 (0)