]> git.donarmstrong.com Git - kiibohd-controller.git/blob - Lib/CMake/modules.cmake
Reorganizing CMake build system.
[kiibohd-controller.git] / Lib / CMake / modules.cmake
1 ###| CMAKE Kiibohd Controller Source Configurator |###
2 #
3 # Written by Jacob Alexander in 2011-2014 for the Kiibohd Controller
4 #
5 # Released into the Public Domain
6 #
7 ###
8
9
10
11 ###
12 # Module Overrides (Used in the buildall.bash script)
13 #
14 if ( ( DEFINED ScanModuleOverride ) AND ( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Scan/${ScanModuleOverride} ) )
15         set( ScanModule ${ScanModuleOverride} )
16 endif ()
17
18
19
20 ###
21 # Path Setup
22 #
23 set(  ScanModulePath    "Scan/${ScanModule}"   )
24 set( MacroModulePath   "Macro/${MacroModule}"  )
25 set( OutputModulePath "Output/${OutputModule}" )
26 set( DebugModulePath   "Debug/${DebugModule}"  )
27
28 #| Top-level directory adjustment
29 set( HEAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
30
31
32
33 ###
34 # Module Check Function
35 #
36
37 #| Usage:
38 #|  PathPrepend( ModulePath <ListOfFamiliesSupported> )
39 #| Uses the ${COMPILER_FAMILY} variable
40 function( ModuleCompatibility ModulePath )
41         foreach( mod_var ${ARGN} )
42                 if ( ${mod_var} STREQUAL ${COMPILER_FAMILY} )
43                         # Module found, no need to scan further
44                         return()
45                 endif ()
46         endforeach()
47
48         message( FATAL_ERROR "${ModulePath} does not support the ${COMPILER_FAMILY} family..." )
49 endfunction()
50
51
52
53 ###
54 # Module Configuration
55 #
56
57 #| Additional options, usually define settings
58 add_definitions()
59
60 #| Include path for each of the modules
61 add_definitions(
62         -I${HEAD_DIR}/${ScanModulePath}
63         -I${HEAD_DIR}/${MacroModulePath}
64         -I${HEAD_DIR}/${OutputModulePath}
65         -I${HEAD_DIR}/${DebugModulePath}
66 )
67
68
69
70
71 ###
72 # Module Processing
73 #
74
75 #| Go through lists of sources and append paths
76 #| Usage:
77 #|  PathPrepend( OutputListOfSources <Prepend Path> <InputListOfSources> )
78 macro( PathPrepend Output SourcesPath )
79         unset( tmpSource )
80
81         # Loop through items
82         foreach( item ${ARGN} )
83                 # Set the path
84                 set( tmpSource ${tmpSource} "${SourcesPath}/${item}" )
85         endforeach()
86
87         # Finalize by writing the new list back over the old one
88         set( ${Output} ${tmpSource} )
89 endmacro()
90
91
92 #| Scan Module
93 include    (            "${ScanModulePath}/setup.cmake"  )
94 PathPrepend(  SCAN_SRCS  ${ScanModulePath} ${SCAN_SRCS}  )
95
96 #| Macro Module
97 include    (           "${MacroModulePath}/setup.cmake"  )
98 PathPrepend( MACRO_SRCS ${MacroModulePath} ${MACRO_SRCS} )
99
100 #| Output Module
101 include    (             "${OutputModulePath}/setup.cmake"   )
102 PathPrepend( OUTPUT_SRCS  ${OutputModulePath} ${OUTPUT_SRCS} )
103
104 #| Debugging Module
105 include    (           "${DebugModulePath}/setup.cmake"  )
106 PathPrepend( DEBUG_SRCS ${DebugModulePath} ${DEBUG_SRCS} )
107
108
109 #| Default Map
110 # TODO Add support for different defaultMaps
111 configure_file( "${ScanModulePath}/defaultMap.h" defaultMap.h )
112
113
114 #| Print list of all module sources
115 message( STATUS "Detected Scan Module Source Files:" )
116 message( "${SCAN_SRCS}" )
117 message( STATUS "Detected Macro Module Source Files:" )
118 message( "${MACRO_SRCS}" )
119 message( STATUS "Detected Output Module Source Files:" )
120 message( "${OUTPUT_SRCS}" )
121 message( STATUS "Detected Debug Module Source Files:" )
122 message( "${DEBUG_SRCS}" )
123
124
125
126 ###
127 # Generate USB Defines
128 #
129
130 #| Manufacturer name
131 set( MANUFACTURER "Kiibohd" )
132
133
134 #| Serial Number
135 #| Attempt to call Git to get the branch, last commit date, and whether code modified since last commit
136
137 #| Modified
138 #| Takes a bit of work to extract the "M " using CMake, and not using it if there are no modifications
139 execute_process( COMMAND git status -s -uno --porcelain
140         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
141         OUTPUT_VARIABLE Git_Modified_INFO
142         ERROR_QUIET
143         OUTPUT_STRIP_TRAILING_WHITESPACE
144 )
145 string( LENGTH "${Git_Modified_INFO}" Git_Modified_LENGTH )
146 set( Git_Modified_Status "Clean" )
147 if ( ${Git_Modified_LENGTH} GREATER 2 )
148         string( SUBSTRING "${Git_Modified_INFO}" 1 2 Git_Modified_Flag_INFO )
149         set( Git_Modified_Status "Dirty" )
150 endif ()
151
152 #| Branch
153 execute_process( COMMAND git rev-parse --abbrev-ref HEAD
154         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
155         OUTPUT_VARIABLE Git_Branch_INFO
156         ERROR_QUIET
157         OUTPUT_STRIP_TRAILING_WHITESPACE
158 )
159
160 #| Date
161 execute_process( COMMAND git show -s --format=%ci
162         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
163         OUTPUT_VARIABLE Git_Date_INFO
164         ERROR_QUIET
165         OUTPUT_STRIP_TRAILING_WHITESPACE
166 )
167
168 #| Commit Author and Email
169 execute_process( COMMAND git show -s --format="%cn <%ce>"
170         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
171         OUTPUT_VARIABLE Git_Commit_Author
172         ERROR_QUIET
173         OUTPUT_STRIP_TRAILING_WHITESPACE
174 )
175
176 #| Commit Revision
177 execute_process( COMMAND git show -s --format=%H
178         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
179         OUTPUT_VARIABLE Git_Commit_Revision
180         ERROR_QUIET
181         OUTPUT_STRIP_TRAILING_WHITESPACE
182 )
183
184 #| Origin URL
185 execute_process( COMMAND git config --get remote.origin.url
186         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
187         OUTPUT_VARIABLE Git_Origin_URL
188         ERROR_QUIET
189         OUTPUT_STRIP_TRAILING_WHITESPACE
190 )
191
192 #| Build Date
193 execute_process( COMMAND "date" "+%Y-%m-%d %T %z"
194         OUTPUT_VARIABLE Build_Date
195         ERROR_QUIET
196         OUTPUT_STRIP_TRAILING_WHITESPACE
197 )
198
199 #| Last Commit Date
200 set( GitLastCommitDate "${Git_Modified_Status} ${Git_Branch_INFO} - ${Git_Date_INFO}" )
201
202 #| Uses CMake variables to include as defines
203 #| Primarily for USB configuration
204 configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Lib/_buildvars.h buildvars.h )
205
206
207
208 ###
209 # Source Defines
210 #
211 set( SRCS
212         ${MAIN_SRCS}
213         ${COMPILER_SRCS}
214         ${SCAN_SRCS}
215         ${MACRO_SRCS}
216         ${OUTPUT_SRCS}
217         ${DEBUG_SRCS}
218 )
219
220 #| Directories to include by default
221 include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} )
222
223
224
225 ###
226 # Module Compatibility Check
227 #
228
229 #| Check for whether the set modules are compatible with the specified compiler family
230 ModuleCompatibility( ${ScanModulePath}   ${ScanModuleCompatibility}   )
231 ModuleCompatibility( ${MacroModulePath}  ${MacroModuleCompatibility}  )
232 ModuleCompatibility( ${OutputModulePath} ${OutputModuleCompatibility} )
233 ModuleCompatibility( ${DebugModulePath}  ${DebugModuleCompatibility}  )
234
235
236
237 ###
238 # CMake Module Checking
239 #
240 find_package( Git REQUIRED )
241
242
243 ###
244 # Build Targets
245 #
246
247 #| Create the .ELF file
248 set( TARGET_ELF ${TARGET}.elf )
249 add_executable( ${TARGET_ELF} ${SRCS} )
250
251
252 #| .ELF Properties
253 set_target_properties( ${TARGET_ELF} PROPERTIES
254         LINK_FLAGS ${LINKER_FLAGS}
255         SUFFIX ""                               # XXX Force Windows to keep the .exe off
256 )
257
258
259 #| Convert the .ELF into a .HEX to load onto the Teensy
260 set( TARGET_HEX ${TARGET}.hex )
261 add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
262         COMMAND ${CMAKE_OBJCOPY} ${HEX_FLAGS} ${TARGET_ELF} ${TARGET_HEX}
263         COMMENT "Creating load file for Flash:  ${TARGET_HEX}"
264 )
265
266
267 #| Generate the Extended .LSS
268 set( TARGET_LSS ${TARGET}.lss )
269 add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
270         COMMAND ${CMAKE_OBJDUMP} ${LSS_FLAGS} ${TARGET_ELF} > ${TARGET_LSS}
271         COMMENT "Creating Extended Listing:     ${TARGET_LSS}"
272 )
273
274
275 #| Generate the Symbol Table .SYM
276 set( TARGET_SYM ${TARGET}.sym )
277 add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
278         COMMAND ${CMAKE_NM} -n ${TARGET_ELF} > ${TARGET_SYM}
279         COMMENT "Creating Symbol Table:         ${TARGET_SYM}"
280 )
281
282
283
284 ###
285 # Size Information
286 #
287
288 #| After Changes Size Information
289 #| TODO Do lookup on Flash and RAM sizes and do % used
290 add_custom_target( SizeAfter ALL
291         COMMAND ${CMAKE_SIZE} --target=${FORMAT} ${TARGET_HEX} ${TARGET_ELF}
292         DEPENDS ${TARGET_ELF}
293         COMMENT "Size after generation\n\tFlash Usage: data (hex)\n\t  RAM Usage: data (elf)"
294 )
295
296
297
298 ###
299 # Setup Loader Script and Program
300 #
301
302
303 #| Provides the user with the correct teensy-loader-cli command for the built .HEX file
304 #| Windows
305 if( CMAKE_SYSTEM_NAME MATCHES "Windows" )
306         configure_file( LoadFile/winload load NEWLINE_STYLE UNIX )
307 #| Default
308 else()
309         configure_file( LoadFile/load load NEWLINE_STYLE UNIX )
310 endif()
311
312