@@ -31,70 +31,162 @@ function(cbuild_set_option_flags lang option value flags)
3131 list (FIND ${option} _VALUES "${value} " _index)
3232 if (${_index} GREATER -1)
3333 list (GET ${option} _${lang} _FLAGS ${_index} flag)
34- if (NOT flag STREQUAL "" )
35- string (STRIP "${flag} ${${flags} }" ${flags} )
36- set (${flags} "${${flags} }" PARENT_SCOPE )
37- endif ()
34+ set (${flags} "${flag} ${${flags} }" PARENT_SCOPE )
3835 elseif (NOT value STREQUAL "" )
3936 string (TOLOWER "${option} " _option)
4037 message (FATAL_ERROR "unknown '${_option} ' value '${value} ' !" )
4138 endif ()
4239endfunction ()
4340
4441function (cbuild_set_options_flags lang optimize debug warnings language flags )
45- set (tmp "" )
42+ set (tmp)
4643 cbuild_set_option_flags (${lang} OPTIMIZE "${optimize} " tmp )
4744 cbuild_set_option_flags (${lang} DEBUG "${debug} " tmp )
4845 cbuild_set_option_flags (${lang} WARNINGS "${warnings} " tmp )
49- if (lang STREQUAL "CC" OR lang STREQUAL "CXX" )
50- cbuild_set_option_flags (${lang} LANGUAGE "${language} " tmp )
51- endif ()
52- set (${flags} "${tmp} " PARENT_SCOPE )
46+ cbuild_set_option_flags (${lang} LANGUAGE "${language} " tmp )
47+ set (${flags} "${tmp} ${${flags} }" PARENT_SCOPE )
5348endfunction ()
5449
55- set (MDFP "" )
56- file ( GLOB_RECURSE ALL_DIRS LIST_DIRECTORIES true " ${DPACK_DIR} /*" )
57- foreach (DIR_PATH ${ALL_DIRS } )
58- if ( IS_DIRECTORY " ${DIR_PATH} " )
59- get_filename_component ( CURRENT_DIR_NAME " ${DIR_PATH} " NAME )
60- if (CURRENT_DIR_NAME STREQUAL DNAME AND EXISTS " ${DIR_PATH} /specs- ${DNAME} " )
61- set (MDFP " ${DIR_PATH} /../../ " )
62- break ()
63- endif ( )
50+ function ( cbuild_set_defines lang defines )
51+ set (TMP_DEFINES )
52+ foreach (DEFINE ${${defines} })
53+ string ( REPLACE " \" " " \\\" " ENTRY ${DEFINE} )
54+ string ( REGEX REPLACE "=.*" "" KEY ${ENTRY} )
55+ if (KEY STREQUAL ENTRY )
56+ set (VALUE "1 " )
57+ else ()
58+ string ( REGEX REPLACE ".*=" "" VALUE ${ENTRY} )
6459 endif ()
65- endforeach ()
60+ if (${lang} STREQUAL "AS_LEG" )
61+ string (APPEND TMP_DEFINES "--defsym ${KEY} =${VALUE} " )
62+ elseif (${lang} STREQUAL "AS_GNU" )
63+ string (APPEND TMP_DEFINES "-Wa,-defsym,\" ${KEY} =${VALUE} \" " )
64+ else ()
65+ string (APPEND TMP_DEFINES "-D${ENTRY} " )
66+ endif ()
67+ endforeach ()
68+ set (${defines} ${TMP_DEFINES} PARENT_SCOPE )
69+ endfunction ()
70+
71+ # XC32 Processor/DFP flags
72+ if (DPACK MATCHES "Microchip" )
73+ set (MDFP "" )
74+ file (GLOB_RECURSE ALL_DIRS LIST_DIRECTORIES true "${DPACK_DIR} /*" )
75+ foreach (DIR_PATH ${ALL_DIRS} )
76+ if (IS_DIRECTORY "${DIR_PATH} " AND DIR_PATH MATCHES "xc32/" )
77+ get_filename_component (CURRENT_DIR_NAME "${DIR_PATH} " NAME )
78+ if (CURRENT_DIR_NAME STREQUAL DNAME AND EXISTS "${DIR_PATH} /specs-${DNAME} " )
79+ set (MDFP "${DIR_PATH} /../../" )
80+ break ()
81+ endif ()
82+ endif ()
83+ endforeach ()
84+
85+ if (NOT DEFINED MDFP OR MDFP STREQUAL "" )
86+ message (FATAL_ERROR " Error: Could not determine the DFP path for -mdfp option!!" )
87+ endif ()
88+ set (XC32_COMMON_FLAGS "-mprocessor=${DNAME} -mdfp=${MDFP} " )
89+ else ()
90+ set (XC_MODE "-mthumb" )
91+ if (CPU MATCHES "ARM9" )
92+ set (HAS_FPU_HARDWARE FALSE )
93+ set (XC_MODE "-marm" )
94+ elseif (CPU MATCHES "Cortex-M0" )
95+ if (CPU MATCHES "Cortex-M0+" )
96+ set (CPU "Cortex-M0plus" )
97+ endif ()
98+ set (HAS_FPU_HARDWARE FALSE )
99+ elseif (CPU STREQUAL "Cortex-M3" )
100+ set (HAS_FPU_HARDWARE FALSE )
101+ elseif (CPU MATCHES "Cortex-M4|Cortex-M7" )
102+ set (HAS_FPU_HARDWARE TRUE )
103+ elseif (CPU MATCHES "Cortex-M23" )
104+ set (HAS_FPU_HARDWARE FALSE )
105+ elseif (CPU MATCHES "Cortex-M33" )
106+ set (HAS_FPU_HARDWARE TRUE )
107+ elseif (CPU MATCHES "Cortex-A" )
108+ set (HAS_FPU_HARDWARE TRUE )
109+ set (XC_MODE "-marm" )
110+ else ()
111+ message (FATAL_ERROR "Error: CPU not supported by XC32!!" )
112+ endif ()
113+
114+ if (FPU STREQUAL "NOT_FPU" OR NOT FPU OR NOT HAS_FPU_HARDWARE)
115+ set (XC_MABI "soft" )
116+ else ()
117+ set (XC_MABI "hard" )
118+ endif ()
119+
120+ set (XC32_COMMON_FLAGS "-forceArch=pic32c ${XC_MODE} -mcpu=${CPU} -mfloat-abi=${XC_MABI} " )
66121
67- if (NOT DEFINED MDFP OR MDFP STREQUAL "" )
68- message (FATAL_ERROR " Error: Could not determine the DFP path for -mdfp option!!" )
69122endif ()
70123
71124set (OPTIMIZE_VALUES "debug" "none" "balanced" "size" "speed" )
72125set (OPTIMIZE_CC_FLAGS "-Og" "-O0" "-O2" "-Os" "-O1" )
73126set (OPTIMIZE_CXX_FLAGS ${OPTIMIZE_CC_FLAGS} )
74127set (OPTIMIZE_LD_FLAGS ${OPTIMIZE_CC_FLAGS} )
75128set (OPTIMIZE_ASM_FLAGS ${OPTIMIZE_CC_FLAGS} )
129+ set (OPTIMIZE_AS_GNU_FLAGS ${OPTIMIZE_CC_FLAGS} )
76130
77131set (DEBUG_VALUES "on" "off" )
78132set (DEBUG_CC_FLAGS "-g" "" )
79133set (DEBUG_CXX_FLAGS "-g" "" )
80134set (DEBUG_LD_FLAGS "-g" "" )
81135set (DEBUG_ASM_FLAGS "-g" "" )
136+ set (DEBUG_AS_GNU_FLAGS "-g" "" )
82137
83138set (WARNINGS_VALUES "on" "off" "all" )
84139set (WARNINGS_CC_FLAGS "-Wall" "-w" "-Wall -Wextra" )
85140set (WARNINGS_CXX_FLAGS "-Wall" "-w" "-Wall -Wextra" )
86141set (WARNINGS_ASM_FLAGS "-Wall" "-w" "-Wall -Wextra" )
142+ set (WARNINGS_AS_GNU_FLAGS "-Wall" "-w" "-Wall -Wextra" )
87143set (WARNINGS_LD_FLAGS "" "" "" )
88144
89145set (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" "" "" "" "" )
90146set (LANGUAGE_CC_FLAGS "-std=c90" "-std=gnu90" "-std=c99" "-std=gnu99" "-std=c11" "-std=gnu11" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" )
91147set (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" "" "" "" "" )
92148
93- # XC32 Processor/DFP flags
94- set (XC32_COMMON_FLAGS "-mprocessor=${DNAME} -mdfp=${MDFP} " )
149+ # Assembler
95150
96- set (CPP_FLAGS "-E -P ${XC32_COMMON_FLAGS} -xc" )
151+ set (AS_LEG_CPU ${XC32_COMMON_FLAGS} )
152+ set (AS_GNU_CPU ${XC32_COMMON_FLAGS} )
153+ set (ASM_CPU ${XC32_COMMON_FLAGS} )
154+
155+ set (AS_LEG_FLAGS)
156+ set (AS_GNU_FLAGS "-c" )
157+ set (ASM_FLAGS "-c" )
158+
159+ set (AS_LEG_DEFINES ${DEFINES} )
160+ cbuild_set_defines (AS_LEG AS_LEG_DEFINES )
161+ set (AS_GNU_DEFINES ${DEFINES} )
162+ cbuild_set_defines (AS_GNU AS_GNU_DEFINES )
163+ set (ASM_DEFINES ${DEFINES} )
164+ cbuild_set_defines (ASM ASM_DEFINES )
165+
166+ set (AS_LEG_OPTIONS_FLAGS)
167+ cbuild_set_options_flags (AS_LEG "${OPTIMIZE} " "${DEBUG} " "${WARNINGS} " "" AS_LEG_OPTIONS_FLAGS )
168+ set (AS_GNU_OPTIONS_FLAGS)
169+ cbuild_set_options_flags (AS_GNU "${OPTIMIZE} " "${DEBUG} " "${WARNINGS} " "" AS_GNU_OPTIONS_FLAGS )
170+ set (ASM_OPTIONS_FLAGS)
171+ cbuild_set_options_flags (ASM "${OPTIMIZE} " "${DEBUG} " "${WARNINGS} " "" ASM_OPTIONS_FLAGS )
172+
173+ if (BYTE_ORDER STREQUAL "Little-endian" )
174+ set (ASM_BYTE_ORDER "-mlittle-endian" )
175+ elseif (BYTE_ORDER STREQUAL "Big-endian" )
176+ set (ASM_BYTE_ORDER "-mbig-endian" )
177+ endif ()
178+ set (AS_LEG_BYTE_ORDER "${ASM_BYTE_ORDER} " )
179+ set (AS_GNU_BYTE_ORDER "${ASM_BYTE_ORDER} " )
180+
181+ #C Pre-Processor
182+
183+ if (SECURE STREQUAL "Secure" OR SECURE STREQUAL "Secure-only" )
184+ set (CC_SECURE "-mcmse" )
185+ endif ()
186+
187+ set (CPP_FLAGS "-E -P ${XC32_COMMON_FLAGS} -xc ${CC_SECURE} " )
97188set (CPP_DEFINES ${LD_SCRIPT_PP_DEFINES} )
189+ cbuild_set_defines (CC CPP_DEFINES )
98190if (DEFINED LD_REGIONS AND NOT LD_REGIONS STREQUAL "" )
99191 set (CPP_INCLUDES "-include \" ${LD_REGIONS} \" " )
100192endif ()
@@ -103,40 +195,60 @@ separate_arguments(CPP_ARGS_LD_SCRIPT NATIVE_COMMAND ${CPP_ARGS_LD_SCRIPT})
103195
104196# C Compiler
105197
106- set (CC_OPTIONS_FLAGS "" )
198+ set (CC_CPU "${XC32_COMMON_FLAGS} " )
199+ set (CC_DEFINES ${ASM_DEFINES} )
200+ set (CC_BYTE_ORDER ${ASM_BYTE_ORDER} )
201+ set (CC_FLAGS)
202+ set (CC_OPTIONS_FLAGS)
203+ set (CC_LTO "-flto" )
204+ set (_PI "-include " )
205+ set (_ISYS "-isystem " )
107206cbuild_set_options_flags (CC "${OPTIMIZE} " "${DEBUG} " "${WARNINGS} " "${LANGUAGE_CC} " CC_OPTIONS_FLAGS )
108- set (CMAKE_C_FLAGS "${XC32_COMMON_FLAGS} ${CC_OPTIONS_FLAGS} " )
109207
208+ if (BRANCHPROT STREQUAL "NO_BRANCHPROT" )
209+ set (CC_BRANCHPROT "-mbranch-protection=none" )
210+ elseif (BRANCHPROT STREQUAL "BTI" )
211+ set (CC_BRANCHPROT "-mbranch-protection=bti" )
212+ elseif (BRANCHPROT STREQUAL "BTI_SIGNRET" )
213+ set (CC_BRANCHPROT "-mbranch-protection=bti+pac-ret" )
214+ endif ()
110215
111216# C++ Compiler
112217
113- set (CXX_OPTIONS_FLAGS "" )
218+ set (CXX_CPU "${CC_CPU} " )
219+ set (CXX_DEFINES "${CC_DEFINES} " )
220+ set (CXX_BYTE_ORDER "${CC_BYTE_ORDER} " )
221+ set (CXX_FLAGS "${CC_FLAGS} " )
222+ set (CXX_OPTIONS_FLAGS)
223+ set (CXX_LTO "${CC_LTO} " )
224+ set (CXX_SECURE "${CC_SECURE} " )
225+ set (CXX_BRANCHPROT "${CC_BRANCHPROT} " )
114226cbuild_set_options_flags (CXX "${OPTIMIZE} " "${DEBUG} " "${WARNINGS} " "${LANGUAGE_CXX} " CXX_OPTIONS_FLAGS )
115- set (CMAKE_CXX_FLAGS "${XC32_COMMON_FLAGS} ${CXX_OPTIONS_FLAGS} " )
116-
117- # Assembler
118-
119- set (ASM_OPTIONS_FLAGS "" )
120- cbuild_set_options_flags (ASM "${OPTIMIZE} " "${DEBUG} " "${WARNINGS} " "" ASM_OPTIONS_FLAGS )
121- set (CMAKE_ASM_FLAGS "${XC32_COMMON_FLAGS} ${ASM_OPTIONS_FLAGS} " )
122227
123228# Linker
124229
125- set (LD_OPTIONS_FLAGS "" )
230+ set (LD_CPU ${XC32_COMMON_FLAGS} )
231+ set (_LS "-T " )
232+ set (LD_FLAGS)
233+ set (LD_OPTIONS_FLAGS)
126234cbuild_set_options_flags (LD "${OPTIMIZE} " "${DEBUG} " "${WARNINGS} " "" LD_OPTIONS_FLAGS )
127- set (CMAKE_EXE_LINKER_FLAGS "${XC32_COMMON_FLAGS} ${LD_OPTIONS_FLAGS} -T" )
128235
129236# ELF to HEX conversion
130- set (ELF2HEX -O ihex "${OUT_DIR} /$<TARGET_PROPERTY :${TARGET} ,OUTPUT_NAME >.elf " "${OUT_DIR} /${HEX_FILE} " )
237+ set (ELF2HEX -O ihex "${OUT_DIR} /$<TARGET_PROPERTY :${TARGET} ,OUTPUT_NAME >$< TARGET_PROPERTY : ${TARGET} , SUFFIX > " "${OUT_DIR} /${HEX_FILE} " )
131238
132239# ELF to BIN conversion
133- set (ELF2BIN -O binary "${OUT_DIR} /$<TARGET_PROPERTY :${TARGET} ,OUTPUT_NAME >.elf " "${OUT_DIR} /${BIN_FILE} " )
240+ set (ELF2BIN -O binary "${OUT_DIR} /$<TARGET_PROPERTY :${TARGET} ,OUTPUT_NAME >$< TARGET_PROPERTY : ${TARGET} , SUFFIX > " "${OUT_DIR} /${BIN_FILE} " )
134241
135242# Set CMake variables for toolchain initialization
243+ set (CMAKE_C_FLAGS_INIT "${CC_CPU} " )
244+ set (CMAKE_CXX_FLAGS_INIT "${CXX_CPU} " )
136245set (CMAKE_SYSTEM_NAME Generic)
137246set (CMAKE_CROSSCOMPILING TRUE )
138247set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
139- set (CMAKE_ASM_COMPILER "${AS} " )
248+ set (CMAKE_ASM_COMPILER "${CC} " )
249+ set (CMAKE_AS_LEG_COMPILER "${AS} " )
250+ set (CMAKE_AS_GNU_COMPILER "${CC} " )
140251set (CMAKE_C_COMPILER "${CC} " )
141252set (CMAKE_CXX_COMPILER "${CXX} " )
142253set (CMAKE_OBJCOPY "${OC} " )
254+ set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR} /CMakeASM" )
0 commit comments