2011-09-29 06:25:51 +00:00
###| CMAKE Kiibohd Controller Source Configurator |###
#
2014-03-22 21:32:06 +00:00
# Written by Jacob Alexander in 2011-2014 for the Kiibohd Controller
2011-09-29 06:25:51 +00:00
#
# Released into the Public Domain
#
###
2013-01-15 02:31:50 +00:00
###
# Module Overrides (Used in the buildall.bash script)
#
2013-02-02 02:19:31 +00:00
if ( ( DEFINED ScanModuleOverride ) AND ( EXISTS ${ CMAKE_CURRENT_SOURCE_DIR } /Scan/ ${ ScanModuleOverride } ) )
2013-01-15 02:31:50 +00:00
set ( ScanModule ${ ScanModuleOverride } )
2013-02-02 02:19:31 +00:00
endif ( )
2013-01-15 02:31:50 +00:00
2011-09-29 06:25:51 +00:00
###
# Path Setup
2014-01-20 00:40:36 +00:00
#
2014-03-22 21:32:06 +00:00
set ( ScanModulePath "Scan/${ScanModule}" )
set ( MacroModulePath "Macro/${MacroModule}" )
2014-01-20 00:40:36 +00:00
set ( OutputModulePath "Output/${OutputModule}" )
2014-03-22 21:32:06 +00:00
set ( DebugModulePath "Debug/${DebugModule}" )
2011-09-29 06:25:51 +00:00
2011-09-29 22:30:24 +00:00
#| Top-level directory adjustment
2013-01-26 09:34:33 +00:00
set ( HEAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
2011-09-29 22:30:24 +00:00
2011-09-29 06:25:51 +00:00
2013-01-30 23:13:49 +00:00
###
# Module Check Function
#
#| Usage:
#| PathPrepend( ModulePath <ListOfFamiliesSupported> )
#| Uses the ${COMPILER_FAMILY} variable
function ( ModuleCompatibility ModulePath )
foreach ( mod_var ${ ARGN } )
if ( ${ mod_var } STREQUAL ${ COMPILER_FAMILY } )
# Module found, no need to scan further
return ( )
2013-02-02 04:35:12 +00:00
endif ( )
endforeach ( )
2013-01-30 23:13:49 +00:00
message ( FATAL_ERROR "${ModulePath} does not support the ${COMPILER_FAMILY} family..." )
2013-02-02 02:19:31 +00:00
endfunction ( )
2013-01-30 23:13:49 +00:00
2011-09-29 06:25:51 +00:00
###
# Module Configuration
#
#| Additional options, usually define settings
add_definitions ( )
2011-09-29 22:30:24 +00:00
#| Include path for each of the modules
add_definitions (
- I $ { H E A D _ D I R } / $ { S c a n M o d u l e P a t h }
- I $ { H E A D _ D I R } / $ { M a c r o M o d u l e P a t h }
2014-01-20 00:40:36 +00:00
- I $ { H E A D _ D I R } / $ { O u t p u t M o d u l e P a t h }
2011-09-29 22:30:24 +00:00
- I $ { H E A D _ D I R } / $ { D e b u g M o d u l e P a t h }
)
2011-09-29 06:25:51 +00:00
###
# Module Processing
#
#| Go through lists of sources and append paths
#| Usage:
#| PathPrepend( OutputListOfSources <Prepend Path> <InputListOfSources> )
macro ( PathPrepend Output SourcesPath )
unset ( tmpSource )
# Loop through items
foreach ( item ${ ARGN } )
2011-11-13 10:04:44 +00:00
# Set the path
2011-09-29 06:25:51 +00:00
set ( tmpSource ${ tmpSource } "${SourcesPath}/${item}" )
2013-02-02 04:35:12 +00:00
endforeach ( )
2011-09-29 06:25:51 +00:00
# Finalize by writing the new list back over the old one
set ( ${ Output } ${ tmpSource } )
2013-02-02 04:35:12 +00:00
endmacro ( )
2011-09-29 06:25:51 +00:00
#| Scan Module
2011-09-29 22:30:24 +00:00
include ( "${ScanModulePath}/setup.cmake" )
PathPrepend ( SCAN_SRCS ${ ScanModulePath } ${ SCAN_SRCS } )
2011-09-29 06:25:51 +00:00
#| Macro Module
2011-09-29 22:30:24 +00:00
include ( "${MacroModulePath}/setup.cmake" )
2011-09-29 06:25:51 +00:00
PathPrepend ( MACRO_SRCS ${ MacroModulePath } ${ MACRO_SRCS } )
2014-01-20 00:40:36 +00:00
#| Output Module
include ( "${OutputModulePath}/setup.cmake" )
PathPrepend ( OUTPUT_SRCS ${ OutputModulePath } ${ OUTPUT_SRCS } )
2011-09-29 06:25:51 +00:00
#| Debugging Module
2011-09-29 22:30:24 +00:00
include ( "${DebugModulePath}/setup.cmake" )
2011-09-29 06:25:51 +00:00
PathPrepend ( DEBUG_SRCS ${ DebugModulePath } ${ DEBUG_SRCS } )
2014-04-06 18:49:27 +00:00
#| Default Map
# TODO Add support for different defaultMaps
configure_file ( "${ScanModulePath}/defaultMap.h" defaultMap.h )
2011-09-29 06:25:51 +00:00
#| Print list of all module sources
2011-10-01 07:54:18 +00:00
message ( STATUS "Detected Scan Module Source Files:" )
message ( "${SCAN_SRCS}" )
message ( STATUS "Detected Macro Module Source Files:" )
message ( "${MACRO_SRCS}" )
2014-03-22 21:32:06 +00:00
message ( STATUS "Detected Output Module Source Files:" )
2014-01-20 00:40:36 +00:00
message ( "${OUTPUT_SRCS}" )
2011-10-01 07:54:18 +00:00
message ( STATUS "Detected Debug Module Source Files:" )
message ( "${DEBUG_SRCS}" )
2011-09-29 06:25:51 +00:00
2013-02-02 01:02:55 +00:00
###
# Generate USB Defines
#
#| Manufacturer name
set ( MANUFACTURER "Kiibohd" )
#| Serial Number
#| Attempt to call Git to get the branch, last commit date, and whether code modified since last commit
#| Modified
2013-02-02 04:35:12 +00:00
#| Takes a bit of work to extract the "M " using CMake, and not using it if there are no modifications
2013-02-02 01:02:55 +00:00
execute_process ( COMMAND git status -s -uno --porcelain
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
O U T P U T _ V A R I A B L E G i t _ M o d i f i e d _ I N F O
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
string ( LENGTH "${Git_Modified_INFO}" Git_Modified_LENGTH )
2014-01-23 10:01:12 +00:00
set ( Git_Modified_Status "Clean" )
2013-02-02 01:02:55 +00:00
if ( ${ Git_Modified_LENGTH } GREATER 2 )
string ( SUBSTRING "${Git_Modified_INFO}" 1 2 Git_Modified_Flag_INFO )
2014-01-23 10:01:12 +00:00
set ( Git_Modified_Status "Dirty" )
2013-02-02 02:19:31 +00:00
endif ( )
2013-02-02 01:02:55 +00:00
#| Branch
execute_process ( COMMAND git rev-parse --abbrev-ref HEAD
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
O U T P U T _ V A R I A B L E G i t _ B r a n c h _ I N F O
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
#| Date
execute_process ( COMMAND git show -s --format=%ci
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
O U T P U T _ V A R I A B L E G i t _ D a t e _ I N F O
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
2014-01-23 10:01:12 +00:00
#| Commit Author and Email
execute_process ( COMMAND git show -s --format= "%cn <%ce>"
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
O U T P U T _ V A R I A B L E G i t _ C o m m i t _ A u t h o r
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
#| Commit Revision
execute_process ( COMMAND git show -s --format=%H
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
O U T P U T _ V A R I A B L E G i t _ C o m m i t _ R e v i s i o n
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
#| Origin URL
execute_process ( COMMAND git config --get remote.origin.url
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
O U T P U T _ V A R I A B L E G i t _ O r i g i n _ U R L
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
2014-04-10 03:06:19 +00:00
#| Build Date
execute_process ( COMMAND "date" "+%Y-%m-%d %T %z"
2014-04-13 03:52:32 +00:00
O U T P U T _ V A R I A B L E B u i l d _ D a t e
E R R O R _ Q U I E T
2014-04-10 03:06:19 +00:00
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
2013-02-02 01:02:55 +00:00
2014-04-10 03:06:19 +00:00
#| Last Commit Date
2014-04-13 03:52:32 +00:00
set ( GitLastCommitDate "${Git_Modified_Status} ${Git_Branch_INFO} - ${Git_Date_INFO}" )
2013-02-02 01:02:55 +00:00
#| Uses CMake variables to include as defines
#| Primarily for USB configuration
configure_file ( ${ CMAKE_CURRENT_SOURCE_DIR } /Lib/_buildvars.h buildvars.h )
2014-04-19 05:57:14 +00:00
###
# Source Defines
#
set ( SRCS
$ { M A I N _ S R C S }
$ { C O M P I L E R _ S R C S }
$ { S C A N _ S R C S }
$ { M A C R O _ S R C S }
$ { O U T P U T _ S R C S }
$ { D E B U G _ S R C S }
)
#| Directories to include by default
include_directories ( ${ CMAKE_CURRENT_SOURCE_DIR } ${ CMAKE_CURRENT_BINARY_DIR } )
###
# Module Compatibility Check
#
#| Check for whether the set modules are compatible with the specified compiler family
ModuleCompatibility ( ${ ScanModulePath } ${ ScanModuleCompatibility } )
ModuleCompatibility ( ${ MacroModulePath } ${ MacroModuleCompatibility } )
ModuleCompatibility ( ${ OutputModulePath } ${ OutputModuleCompatibility } )
ModuleCompatibility ( ${ DebugModulePath } ${ DebugModuleCompatibility } )
###
# CMake Module Checking
#
find_package ( Git REQUIRED )
###
# Build Targets
#
#| Create the .ELF file
set ( TARGET_ELF ${ TARGET } .elf )
add_executable ( ${ TARGET_ELF } ${ SRCS } )
#| .ELF Properties
set_target_properties ( ${ TARGET_ELF } PROPERTIES
L I N K _ F L A G S $ { L I N K E R _ F L A G S }
S U F F I X " " # XXX Force Windows to keep the .exe off
)
#| Convert the .ELF into a .HEX to load onto the Teensy
set ( TARGET_HEX ${ TARGET } .hex )
add_custom_command ( TARGET ${ TARGET_ELF } POST_BUILD
C O M M A N D $ { C M A K E _ O B J C O P Y } $ { H E X _ F L A G S } $ { T A R G E T _ E L F } $ { T A R G E T _ H E X }
C O M M E N T " C r e a t i n g l o a d f i l e f o r F l a s h : $ { T A R G E T _ H E X } "
)
#| Generate the Extended .LSS
set ( TARGET_LSS ${ TARGET } .lss )
add_custom_command ( TARGET ${ TARGET_ELF } POST_BUILD
C O M M A N D $ { C M A K E _ O B J D U M P } $ { L S S _ F L A G S } $ { T A R G E T _ E L F } > $ { T A R G E T _ L S S }
C O M M E N T " C r e a t i n g E x t e n d e d L i s t i n g : $ { T A R G E T _ L S S } "
)
#| Generate the Symbol Table .SYM
set ( TARGET_SYM ${ TARGET } .sym )
add_custom_command ( TARGET ${ TARGET_ELF } POST_BUILD
C O M M A N D $ { C M A K E _ N M } - n $ { T A R G E T _ E L F } > $ { T A R G E T _ S Y M }
C O M M E N T " C r e a t i n g S y m b o l T a b l e : $ { T A R G E T _ S Y M } "
)
###
# Size Information
#
#| After Changes Size Information
#| TODO Do lookup on Flash and RAM sizes and do % used
add_custom_target ( SizeAfter ALL
C O M M A N D $ { C M A K E _ S I Z E } - - t a r g e t = $ { F O R M A T } $ { T A R G E T _ H E X } $ { T A R G E T _ E L F }
D E P E N D S $ { T A R G E T _ E L F }
C O M M E N T " S i z e a f t e r g e n e r a t i o n \ n \ t F l a s h U s a g e : data ( hex ) \ n \ t R A M U s a g e : data ( elf ) "
)
###
# Setup Loader Script and Program
#
#| Provides the user with the correct teensy-loader-cli command for the built .HEX file
#| Windows
if ( CMAKE_SYSTEM_NAME MATCHES "Windows" )
configure_file ( LoadFile/winload load NEWLINE_STYLE UNIX )
#| Default
else ( )
configure_file ( LoadFile/load load NEWLINE_STYLE UNIX )
endif ( )