blob: 4fff3c1bbe76a9d01dc21b263486e9a03a2dfb6b [file] [log] [blame]
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +02001function(compilerVersion)
2 execute_process(COMMAND "${CMAKE_C_COMPILER}" -dumpversion
3 OUTPUT_VARIABLE CVERSION
4 ERROR_VARIABLE CVERSION
5 )
6 SET(COMPILERVERSION ${CVERSION} PARENT_SCOPE)
7 #cmake_print_variables(CVERSION)
8 #cmake_print_variables(CMAKE_C_COMPILER)
9 #MESSAGE( STATUS "CMD_OUTPUT:" ${CVERSION})
10endfunction()
11
12function(compilerSpecificCompileOptions PROJECTNAME)
13 get_target_property(DISABLEOPTIM ${PROJECTNAME} DISABLEOPTIMIZATION)
14 if ((OPTIMIZED) AND (NOT DISABLEOPTIM))
15 target_compile_options(${PROJECTNAME} PUBLIC "-O2")
16 endif()
17
18 if (FASTMATHCOMPUTATIONS)
19 target_compile_options(${PROJECTNAME} PUBLIC "-ffast-math")
20 endif()
21
22 if (HARDFP)
23 target_compile_options(${PROJECTNAME} PUBLIC "-mfloat-abi=hard")
24 target_link_options(${PROJECTNAME} PUBLIC "-mfloat-abi=hard")
25 endif()
26
27 if (LITTLEENDIAN)
28 target_compile_options(${PROJECTNAME} PUBLIC "-mlittle-endian")
29 endif()
30
31 if (CORTEXM)
32 target_compile_options(${PROJECTNAME} PUBLIC "-mthumb")
33 endif()
34
35 # Need to add other gcc config for other cortex-m cores
36 if (ARM_CPU STREQUAL "cortex-m7" )
37 target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7e-m;-mfpu=fpv5-d16")
38 target_link_options(${PROJECTNAME} PUBLIC "-march=armv7e-m;-mfpu=fpv5-d16")
39 endif()
Christophe Favergeon93b52c82019-12-17 11:37:34 +010040
41 if (ARM_CPU STREQUAL "cortex-m0" )
42 target_compile_options(${PROJECTNAME} PUBLIC "-march=armv6-m")
43 target_link_options(${PROJECTNAME} PUBLIC "-march=armv6-m")
44 endif()
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020045
46
47 if (ARM_CPU STREQUAL "cortex-a9" )
48 if (NOT (NEON OR NEONEXPERIMENTAL))
49 target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
50 target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
51 endif()
52 endif()
53
54 if (ARM_CPU STREQUAL "cortex-a7" )
55 if (NOT (NEON OR NEONEXPERIMENTAL))
56 target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
57 target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
58 endif()
59 endif()
60
61 if (ARM_CPU STREQUAL "cortex-a5" )
62 if ((NEON OR NEONEXPERIMENTAL))
Christophe Favergeonc1593422019-10-21 13:50:41 +020063 target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4")
64 target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4")
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020065 else()
66 target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
67 target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
68 endif()
69 endif()
70
71endfunction()
72
73function(preprocessScatter CORE PLATFORMFOLDER SCATTERFILE)
74
75
76 file(REMOVE ${SCATTERFILE})
77
78 # Copy the mem file to the build directory
79 # so that it can be find when preprocessing the scatter file
80 # since we cannot pass an include path to armlink
81 add_custom_command(
82 OUTPUT
83 ${SCATTERFILE}
84 COMMAND
85 ${CMAKE_C_COMPILER} -E -x c -I${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC -o ${SCATTERFILE} ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/lnk.ld
86 COMMAND
87 python ${ROOT}/CMSIS/DSP/filterLinkScript.py ${SCATTERFILE}
88 DEPENDS
89 "${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/lnk.ld;${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/mem_${CORE}.h"
90 )
91
92 add_custom_target(
93 scatter ALL
94 DEPENDS "${SCATTERFILE};${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/mem_${CORE}.h"
95 )
96
97 add_dependencies(${PROJECTNAME} scatter)
98endfunction()
99
Christophe Favergeon26c2f682019-09-06 14:43:32 +0100100function(toolchainSpecificLinkForCortexM PROJECTNAME ROOT CORE PLATFORMFOLDER HASCSTARTUP)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200101 target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.S)
102 target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/support.c)
103
104 target_include_directories(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC)
105
Christophe Favergeonc4c34802019-09-24 14:05:01 +0200106 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tempLink)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200107 set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/lnk.ld)
108 preprocessScatter(${CORE} ${PLATFORMFOLDER} ${SCATTERFILE})
109
110 set_target_properties(${PROJECTNAME} PROPERTIES LINK_DEPENDS "${SCATTERFILE}")
111
112 target_link_options(${PROJECTNAME} PRIVATE "--entry=Reset_Handler;-T${SCATTERFILE}")
113endfunction()
114
115function(toolchainSpecificLinkForCortexA PROJECTNAME ROOT CORE PLATFORMFOLDER)
116 target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.c)
117 target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/support.c)
118
119 # RTE Components
120 target_include_directories(${PROJECTNAME} PRIVATE ${ROOT}/CMSIS/DSP/Testing)
Christophe Favergeon93b52c82019-12-17 11:37:34 +0100121 target_include_directories(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200122
Christophe Favergeon93b52c82019-12-17 11:37:34 +0100123 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tempLink)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200124 set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/lnk.ld)
125 preprocessScatter(${CORE} ${PLATFORMFOLDER} ${SCATTERFILE})
126
Christophe Favergeon93b52c82019-12-17 11:37:34 +0100127
128 set_target_properties(${PROJECTNAME} PROPERTIES LINK_DEPENDS "${SCATTERFILE}")
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200129
130 target_link_options(${PROJECTNAME} PRIVATE "--entry=Reset_Handler;-T${SCATTERFILE}")
131endfunction()
132
133function(compilerSpecificPlatformConfigLibForM PROJECTNAME ROOT)
134 if (SEMIHOSTING)
135 target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
136 target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
137 else()
138 target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
139 target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
140 endif()
141endfunction()
142
143function(compilerSpecificPlatformConfigLibForA PROJECTNAME ROOT)
144 if (SEMIHOSTING)
145 target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
146 target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
147 else()
148 target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
149 target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
150 endif()
151endfunction()
152
153function(compilerSpecificPlatformConfigAppForM PROJECTNAME ROOT)
154 if (SEMIHOSTING)
155 target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
156 target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
157 else()
158 target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
159 target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
160 endif()
161endfunction()
162
163function(compilerSpecificPlatformConfigAppForA PROJECTNAME ROOT)
164 if (SEMIHOSTING)
165 target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
166 target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
167 else()
168 target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
169 target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
170 endif()
171endfunction()