changeset 147:95da03b43860

Reorganizing CMake build system. - Only one file to edit now - Compiler architecture automatically detected based off of chip target
author Jacob Alexander <haata@kiibohd.com>
date Fri, 18 Apr 2014 22:57:14 -0700
parents 9a8eb9fbf177
children 15814bf7b0cc
files CMakeLists.txt Lib/CMake/arm.cmake Lib/CMake/avr.cmake Lib/CMake/initialize.cmake Lib/CMake/modules.cmake README arm.cmake avr.cmake setup.cmake
diffstat 9 files changed, 690 insertions(+), 702 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Fri Apr 18 21:58:14 2014 -0700
+++ b/CMakeLists.txt	Fri Apr 18 22:57:14 2014 -0700
@@ -7,37 +7,82 @@
 #
 ###
 
-#| Windows / Cygwin Compatibility options
-set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
-set( CMAKE_USE_RELATIVE_PATHS  1 )
+
+
+###
+# Chip Selection
+#
+
+#| You _MUST_ set this to match the microcontroller you are trying to compile for
+#| You _MUST_ clean the build directory if you change this value
+#|
+set( CHIP
+#	"at90usb162"       # Teensy   1.0 (avr)
+#	"atmega32u4"       # Teensy   2.0 (avr)
+#	"at90usb646"       # Teensy++ 1.0 (avr)
+	"at90usb1286"      # Teensy++ 2.0 (avr)
+#	"mk20dx128"        # Teensy   3.0 (arm)
+#	"mk20dx256"        # Teensy   3.1 (arm)
+)
+
+
+
+###
+# Compiler Intialization
+#
+include( Lib/CMake/initialize.cmake )
 
 
 
 ###
-# Compiler Family
+# Project Modules
 #
 
-#| Specify the compiler family to use
-#| Currently only supports AVR and ARM
-#| "avr"       # Teensy   1.0
-#| "avr"       # Teensy   2.0
-#| "avr"       # Teensy++ 1.0
-#| "avr"       # Teensy++ 2.0
-#| "arm"       # Teensy   3.0
-#| "arm"       # Teensy   3.1
-#set( COMPILER_FAMILY "arm" )
-set( COMPILER_FAMILY "avr" )
+#| Note: This is the only section you probably want to modify
+#| Each module is defined by it's own folder (e.g. Scan/Matrix represents the "Matrix" module)
+#| All of the modules must be specified, as they generate the sources list of files to compile
+#| Any modifications to this file will cause a complete rebuild of the project
+
+#| Please look at the {Scan,Macro,USB,Debug}/module.txt for information on the modules and how to create new ones
 
-message( STATUS "Compiler Family:" )
-message( "${COMPILER_FAMILY}" )
+##| Deals with acquiring the keypress information and turning it into a key index
+set(   ScanModule "DPH" )
+
+##| Provides the mapping functions for DefaultMap and handles any macro processing before sending to the OutputModule
+set(  MacroModule "PartialMap" )
+
+##| Sends the current list of usb key codes through USB HID
+set( OutputModule "pjrcUSB" )
+
+##| Debugging source to use, each module has it's own set of defines that it sets
+set(  DebugModule "full" )
 
 
 
-#| Load the compiler family specific configurations
-include( ${COMPILER_FAMILY}.cmake )
+###
+# Keymap Configuration (XXX - Not worky yet, currently ignored)
+#
+
+##| If there are multiple DefaultMaps, it is defined here. If, the specified DefaultMap is not found, defaultMap.h is used.
+set(   DefaultMap "kishsaver" )
+
+##| PartialMap combined keymap layering. The first keymap has the "least" precedence.
+set(  CombinedMap colemak capslock2ctrl )
 
-#| Binutils not set by CMake
-set( CMAKE_SIZE "${_CMAKE_TOOLCHAIN_PREFIX}size" )
+##| ParitalMaps available on top of the CombinedMap. If there are input conflicts, the last PartialMap takes precedence.
+set(  PartialMaps hhkbnav kbdctrl )
+
+##| MacroSets define extra capabilities that are not provided by the Scan or Output modules. Last MacroSet takes precedence.
+set(    MacroSets retype )
+
+
+
+###
+# Source Defines (in addition to the selected Modules)
+#
+set( MAIN_SRCS
+	main.c
+)
 
 
 
@@ -57,113 +102,7 @@
 
 
 ###
-# Source Defines
+# Module Initialization / Compilation / Targets
 #
-
-#| Sources (see setup.h for configuring in/away code blocks or other complete modules)
-#| XXX Not set here in this project, see setup.cmake
-#set( SRCS ./main.c )
-
-#| Instead, include the module source selector
-include( setup.cmake )
-set( SRCS
-	main.c
-	${COMPILER_SRCS}
-	${SCAN_SRCS}
-	${MACRO_SRCS}
-	${OUTPUT_SRCS}
-	${DEBUG_SRCS}
-)
-
-#| 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} )
-
+include( Lib/CMake/modules.cmake )
 
-#| .ELF Properties
-set_target_properties( ${TARGET_ELF} PROPERTIES
-	LINK_FLAGS ${LINKER_FLAGS}
-	SUFFIX ""                               # 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
-	COMMAND ${CMAKE_OBJCOPY} ${HEX_FLAGS} ${TARGET_ELF} ${TARGET_HEX}
-	COMMENT "Creating load file for Flash:  ${TARGET_HEX}"
-)
-
-
-#| Generate the Extended .LSS
-set( TARGET_LSS ${TARGET}.lss )
-add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
-	COMMAND ${CMAKE_OBJDUMP} ${LSS_FLAGS} ${TARGET_ELF} > ${TARGET_LSS}
-	COMMENT "Creating Extended Listing:     ${TARGET_LSS}"
-)
-
-
-#| Generate the Symbol Table .SYM
-set( TARGET_SYM ${TARGET}.sym )
-add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
-	COMMAND ${CMAKE_NM} -n ${TARGET_ELF} > ${TARGET_SYM}
-	COMMENT "Creating Symbol Table:         ${TARGET_SYM}"
-)
-
-
-
-###
-# Size Information
-#
-
-#| After Changes Size Information
-#| TODO Do lookup on Flash and RAM sizes and do % used
-add_custom_target( SizeAfter ALL
-	COMMAND ${CMAKE_SIZE} --target=${FORMAT} ${TARGET_HEX} ${TARGET_ELF}
-	DEPENDS ${TARGET_ELF}
-	COMMENT "Size after generation\n\tFlash Usage: data (hex)\n\t  RAM Usage: 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()
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/CMake/arm.cmake	Fri Apr 18 22:57:14 2014 -0700
@@ -0,0 +1,131 @@
+###| CMAKE Kiibohd Controller |###
+#
+# Jacob Alexander 2011-2014
+# Due to this file's usefulness:
+#
+# Released into the Public Domain
+#
+# Freescale ARM CMake Build Configuration
+#
+###
+
+
+
+#| Set the Compilers (must be set first)
+include( CMakeForceCompiler )
+cmake_force_c_compiler  ( arm-none-eabi-gcc ARMCCompiler )
+cmake_force_cxx_compiler( arm-none-eabi-g++ ARMCxxCompiler )
+set( _CMAKE_TOOLCHAIN_PREFIX arm-none-eabi- )
+
+
+
+###
+# ARM Defines and Linker Options
+#
+
+#| Chip Name (Linker)
+#|
+#| "mk20dx128"        # Teensy   3.0
+#| "mk20dx256"        # Teensy   3.1
+
+message( STATUS "Chip Selected:" )
+message( "${CHIP}" )
+set( MCU "${CHIP}" ) # For loading script compatibility
+
+
+#| Chip Base Type
+#| Automatically chosed based on the chip name.
+if ( "${CHIP}" MATCHES "^mk20dx.*$" )
+	set( CHIP_FAMILY "mk20dx" )
+	message( STATUS "Chip Family:" )
+	message( "${CHIP_FAMILY}" )
+else ()
+	message( FATAL_ERROR "Unknown chip family: ${CHIP}" )
+endif ()
+
+
+#| CPU Type
+#| You _MUST_ set this to match the board you are using
+#| type "make clean" after changing this, so all files will be rebuilt
+#|
+#| "cortex-m4"        # Teensy   3.0, 3.1
+set( CPU "cortex-m4" )
+
+message( STATUS "CPU Selected:" )
+message( "${CPU}" )
+
+
+#| Extra Compiler Sources
+#| Mostly for convenience functions like interrupt handlers
+set( COMPILER_SRCS
+	Lib/${CHIP_FAMILY}.c
+	Lib/delay.c
+)
+
+message( STATUS "Compiler Source Files:" )
+message( "${COMPILER_SRCS}" )
+
+
+#| USB Defines
+set( VENDOR_ID  "0x16C0" )
+set( PRODUCT_ID "0x0487" )
+
+
+#| Compiler flag to set the C Standard level.
+#|     c89   = "ANSI" C
+#|     gnu89 = c89 plus GCC extensions
+#|     c99   = ISO C99 standard (not yet fully implemented)
+#|     gnu99 = c99 plus GCC extensions
+set( CSTANDARD "-std=gnu99" )
+
+
+#| Warning Options
+#|  -Wall...:     warning level
+set( WARN "-Wall -g" )
+
+
+#| Tuning Options
+#|  -f...:        tuning, see GCC manual
+#| NOTE: -fshort-wchar is specified to allow USB strings be passed conveniently
+set( TUNING "-mthumb -nostdlib -fdata-sections -ffunction-sections -fshort-wchar" )
+
+
+#| Optimization level, can be [0, 1, 2, 3, s].
+#|     0 = turn off optimization. s = optimize for size.
+#|     (Note: 3 is not always the best optimization level.)
+set( OPT "s" )
+
+
+#| Output Format
+#| srec, ihex, binary
+set( FORMAT "ihex" )
+
+
+#| Processor frequency.
+#|   Normally the first thing your program should do is set the clock prescaler,
+#|   so your program will run at the correct speed.  You should also set this
+#|   variable to same clock speed.  The _delay_ms() macro uses this, and many
+#|   examples use this variable to calculate timings.  Do not add a "UL" here.
+set( F_CPU "48000000" )
+
+
+#| Dependency Files
+#| Compiler flags to generate dependency files.
+set( GENDEPFLAGS "-MMD" )
+
+
+#| Compiler Flags
+add_definitions( "-mcpu=${CPU} -DF_CPU=${F_CPU} -D_${CHIP}_=1 -O${OPT} ${TUNING} ${WARN} ${CSTANDARD} ${GENDEPFLAGS}" )
+
+
+#| Linker Flags
+set( LINKER_FLAGS "-mcpu=${CPU} -Wl,-Map=${TARGET}.map,--cref -Wl,--gc-sections -mthumb -Wl,--no-wchar-size-warning -T${CMAKE_CURRENT_SOURCE_DIR}/Lib/${CHIP}.ld" )
+
+
+#| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...)
+set( HEX_FLAGS -O ${FORMAT} -R .eeprom )
+
+
+#| Lss Flags
+set( LSS_FLAGS -h -S -z )
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/CMake/avr.cmake	Fri Apr 18 22:57:14 2014 -0700
@@ -0,0 +1,121 @@
+###| CMAKE Kiibohd Controller |###
+#
+# Jacob Alexander 2011-2014
+# Due to this file's usefulness:
+#
+# Released into the Public Domain
+#
+# avr-gcc CMake Build Configuration
+#
+###
+
+
+
+#| Set the Compilers (must be set first)
+include( CMakeForceCompiler )
+cmake_force_c_compiler  ( avr-gcc AVRCCompiler )
+cmake_force_cxx_compiler( avr-g++ AVRCxxCompiler )
+set( _CMAKE_TOOLCHAIN_PREFIX avr- )
+
+
+
+###
+# Atmel Defines and Linker Options
+#
+
+#| MCU Name
+#|
+#| "at90usb162"       # Teensy   1.0
+#| "atmega32u4"       # Teensy   2.0
+#| "at90usb646"       # Teensy++ 1.0
+#| "at90usb1286"      # Teensy++ 2.0
+
+set( MCU "${CHIP}" )
+
+message( STATUS "MCU Selected:" )
+message( "${MCU}" )
+
+
+#| Extra Compiler Sources
+#| Mostly for convenience functions like interrupt handlers
+set( COMPILER_SRCS
+	# XXX Not needed for avr-gcc
+)
+
+
+#| CPU Type
+#| This is only informational for AVR microcontrollers
+#| The field can be determined by the microcontroller chip, but currently only one CPU type is used atm
+set( CPU "megaAVR" )
+
+message( STATUS "CPU Selected:" )
+message( "${CPU}" )
+
+
+#| USB Defines
+set( VENDOR_ID  "0x16C0" )
+set( PRODUCT_ID "0x047D" )
+
+
+#| Compiler flag to set the C Standard level.
+#|     c89   = "ANSI" C
+#|     gnu89 = c89 plus GCC extensions
+#|     c99   = ISO C99 standard (not yet fully implemented)
+#|     gnu99 = c99 plus GCC extensions
+set( CSTANDARD "-std=gnu99" )
+
+
+#| Warning Options
+#|  -Wall...:     warning level
+set( WARN "-Wall" )
+
+
+#| Tuning Options
+#|  -f...:        tuning, see GCC manual and avr-libc documentation
+#| NOTE: -fshort-wchar is specified to allow USB strings be passed conveniently
+set( TUNING "-funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums" )
+
+
+#| Optimization level, can be [0, 1, 2, 3, s].
+#|     0 = turn off optimization. s = optimize for size.
+#|     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
+set( OPT "s" )
+
+
+#| Output Format
+#| srec, ihex, binary
+set( FORMAT "ihex" )
+
+
+#| Processor frequency.
+#|   Normally the first thing your program should do is set the clock prescaler,
+#|   so your program will run at the correct speed.  You should also set this
+#|   variable to same clock speed.  The _delay_ms() macro uses this, and many
+#|   examples use this variable to calculate timings.  Do not add a "UL" here.
+set( F_CPU "16000000" )
+
+
+#| Dependency Files
+#| Compiler flags to generate dependency files.
+set( GENDEPFLAGS "-MMD -MP" )
+
+
+#| Compiler Flags
+add_definitions( "-mmcu=${MCU} -DF_CPU=${F_CPU} -D_${MCU}_=1 -O${OPT} ${TUNING} ${WARN} ${CSTANDARD} ${GENDEPFLAGS}" )
+
+
+#| Linker Flags
+set( LINKER_FLAGS "-mmcu=${MCU} -Wl,-Map=${TARGET}.map,--cref -Wl,--relax -Wl,--gc-sections" )
+
+
+#| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...)
+set( HEX_FLAGS -O ${FORMAT} -R .eeprom -R .fuse -R .lock -R .signature )
+
+
+#| Eep Flags (XXX, I've removed this target from the builds, but keeping the set line as a note)
+set( EEP_FLAGS -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ${FORMAT} )
+
+
+#| Lss Flags
+set( LSS_FLAGS -h -S -z )
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/CMake/initialize.cmake	Fri Apr 18 22:57:14 2014 -0700
@@ -0,0 +1,42 @@
+###| CMAKE Kiibohd Controller Initialization |###
+#
+# Written by Jacob Alexander in 2011-2014 for the Kiibohd Controller
+#
+# Released into the Public Domain
+#
+###
+
+
+#| Windows / Cygwin Compatibility options
+set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
+set( CMAKE_USE_RELATIVE_PATHS  1 )
+
+
+
+###
+# Compiler Lookup
+#
+
+#| avr match
+if ( "${CHIP}" MATCHES "^at90usb.*$" OR "${CHIP}" MATCHES "^atmega.*$" )
+	set( COMPILER_FAMILY "avr" )
+
+#| arm match
+elseif ( "${CHIP}" MATCHES "^mk20dx.*$" )
+	set( COMPILER_FAMILY "arm" )
+
+#| Invalid CHIP
+else ()
+	message( FATAL_ERROR "CHIP: ${CHIP} - Unknown chip, could not choose compiler..." )
+endif ()
+
+#| Results of Compiler Lookup
+message( STATUS "Compiler Family:" )
+message( "${COMPILER_FAMILY}" )
+
+#| Load the compiler family specific configurations
+include( Lib/CMake/${COMPILER_FAMILY}.cmake )
+
+#| Binutils not set by CMake
+set( CMAKE_SIZE "${_CMAKE_TOOLCHAIN_PREFIX}size" )
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/CMake/modules.cmake	Fri Apr 18 22:57:14 2014 -0700
@@ -0,0 +1,312 @@
+###| CMAKE Kiibohd Controller Source Configurator |###
+#
+# Written by Jacob Alexander in 2011-2014 for the Kiibohd Controller
+#
+# Released into the Public Domain
+#
+###
+
+
+
+###
+# Module Overrides (Used in the buildall.bash script)
+#
+if ( ( DEFINED ScanModuleOverride ) AND ( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Scan/${ScanModuleOverride} ) )
+	set( ScanModule ${ScanModuleOverride} )
+endif ()
+
+
+
+###
+# Path Setup
+#
+set(  ScanModulePath    "Scan/${ScanModule}"   )
+set( MacroModulePath   "Macro/${MacroModule}"  )
+set( OutputModulePath "Output/${OutputModule}" )
+set( DebugModulePath   "Debug/${DebugModule}"  )
+
+#| Top-level directory adjustment
+set( HEAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
+
+
+
+###
+# 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()
+		endif ()
+	endforeach()
+
+	message( FATAL_ERROR "${ModulePath} does not support the ${COMPILER_FAMILY} family..." )
+endfunction()
+
+
+
+###
+# Module Configuration
+#
+
+#| Additional options, usually define settings
+add_definitions()
+
+#| Include path for each of the modules
+add_definitions(
+	-I${HEAD_DIR}/${ScanModulePath}
+	-I${HEAD_DIR}/${MacroModulePath}
+	-I${HEAD_DIR}/${OutputModulePath}
+	-I${HEAD_DIR}/${DebugModulePath}
+)
+
+
+
+
+###
+# 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} )
+		# Set the path
+		set( tmpSource ${tmpSource} "${SourcesPath}/${item}" )
+	endforeach()
+
+	# Finalize by writing the new list back over the old one
+	set( ${Output} ${tmpSource} )
+endmacro()
+
+
+#| Scan Module
+include    (            "${ScanModulePath}/setup.cmake"  )
+PathPrepend(  SCAN_SRCS  ${ScanModulePath} ${SCAN_SRCS}  )
+
+#| Macro Module
+include    (           "${MacroModulePath}/setup.cmake"  )
+PathPrepend( MACRO_SRCS ${MacroModulePath} ${MACRO_SRCS} )
+
+#| Output Module
+include    (             "${OutputModulePath}/setup.cmake"   )
+PathPrepend( OUTPUT_SRCS  ${OutputModulePath} ${OUTPUT_SRCS} )
+
+#| Debugging Module
+include    (           "${DebugModulePath}/setup.cmake"  )
+PathPrepend( DEBUG_SRCS ${DebugModulePath} ${DEBUG_SRCS} )
+
+
+#| Default Map
+# TODO Add support for different defaultMaps
+configure_file( "${ScanModulePath}/defaultMap.h" defaultMap.h )
+
+
+#| Print list of all module sources
+message( STATUS "Detected Scan Module Source Files:" )
+message( "${SCAN_SRCS}" )
+message( STATUS "Detected Macro Module Source Files:" )
+message( "${MACRO_SRCS}" )
+message( STATUS "Detected Output Module Source Files:" )
+message( "${OUTPUT_SRCS}" )
+message( STATUS "Detected Debug Module Source Files:" )
+message( "${DEBUG_SRCS}" )
+
+
+
+###
+# 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
+#| Takes a bit of work to extract the "M " using CMake, and not using it if there are no modifications
+execute_process( COMMAND git status -s -uno --porcelain
+	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+	OUTPUT_VARIABLE Git_Modified_INFO
+	ERROR_QUIET
+	OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+string( LENGTH "${Git_Modified_INFO}" Git_Modified_LENGTH )
+set( Git_Modified_Status "Clean" )
+if ( ${Git_Modified_LENGTH} GREATER 2 )
+	string( SUBSTRING "${Git_Modified_INFO}" 1 2 Git_Modified_Flag_INFO )
+	set( Git_Modified_Status "Dirty" )
+endif ()
+
+#| Branch
+execute_process( COMMAND git rev-parse --abbrev-ref HEAD
+	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+	OUTPUT_VARIABLE Git_Branch_INFO
+	ERROR_QUIET
+	OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+#| Date
+execute_process( COMMAND git show -s --format=%ci
+	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+	OUTPUT_VARIABLE Git_Date_INFO
+	ERROR_QUIET
+	OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+#| Commit Author and Email
+execute_process( COMMAND git show -s --format="%cn <%ce>"
+	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+	OUTPUT_VARIABLE Git_Commit_Author
+	ERROR_QUIET
+	OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+#| Commit Revision
+execute_process( COMMAND git show -s --format=%H
+	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+	OUTPUT_VARIABLE Git_Commit_Revision
+	ERROR_QUIET
+	OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+#| Origin URL
+execute_process( COMMAND git config --get remote.origin.url
+	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+	OUTPUT_VARIABLE Git_Origin_URL
+	ERROR_QUIET
+	OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+#| Build Date
+execute_process( COMMAND "date" "+%Y-%m-%d %T %z"
+	OUTPUT_VARIABLE Build_Date
+	ERROR_QUIET
+	OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+#| Last Commit Date
+set( GitLastCommitDate "${Git_Modified_Status} ${Git_Branch_INFO} - ${Git_Date_INFO}" )
+
+#| Uses CMake variables to include as defines
+#| Primarily for USB configuration
+configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Lib/_buildvars.h buildvars.h )
+
+
+
+###
+# Source Defines
+#
+set( SRCS
+	${MAIN_SRCS}
+	${COMPILER_SRCS}
+	${SCAN_SRCS}
+	${MACRO_SRCS}
+	${OUTPUT_SRCS}
+	${DEBUG_SRCS}
+)
+
+#| 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
+	LINK_FLAGS ${LINKER_FLAGS}
+	SUFFIX ""                               # 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
+	COMMAND ${CMAKE_OBJCOPY} ${HEX_FLAGS} ${TARGET_ELF} ${TARGET_HEX}
+	COMMENT "Creating load file for Flash:  ${TARGET_HEX}"
+)
+
+
+#| Generate the Extended .LSS
+set( TARGET_LSS ${TARGET}.lss )
+add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
+	COMMAND ${CMAKE_OBJDUMP} ${LSS_FLAGS} ${TARGET_ELF} > ${TARGET_LSS}
+	COMMENT "Creating Extended Listing:     ${TARGET_LSS}"
+)
+
+
+#| Generate the Symbol Table .SYM
+set( TARGET_SYM ${TARGET}.sym )
+add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
+	COMMAND ${CMAKE_NM} -n ${TARGET_ELF} > ${TARGET_SYM}
+	COMMENT "Creating Symbol Table:         ${TARGET_SYM}"
+)
+
+
+
+###
+# Size Information
+#
+
+#| After Changes Size Information
+#| TODO Do lookup on Flash and RAM sizes and do % used
+add_custom_target( SizeAfter ALL
+	COMMAND ${CMAKE_SIZE} --target=${FORMAT} ${TARGET_HEX} ${TARGET_ELF}
+	DEPENDS ${TARGET_ELF}
+	COMMENT "Size after generation\n\tFlash Usage: data (hex)\n\t  RAM Usage: 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()
+
+
--- a/README	Fri Apr 18 21:58:14 2014 -0700
+++ b/README	Fri Apr 18 22:57:14 2014 -0700
@@ -81,84 +81,32 @@
 
 
 ----------------------
-Selecting Architecture
+Selecting Microcontroller
 ----------------------
 
-This is where you choose which architecture you want to build for.
-The options are:
- - Teensy 1.0   (Not tested)
- - Teensy 1.0++ (Not tested)
- - Teensy 2.0
- - Teensy 2.0++
- - Teensy 3.0
- - Teensy 3.1
+This is where you select the chip you want to compile for.
+The build system will automatically select the compiler needed to compile for your chip.
 
 Open up CMakeLists.txt in your favourite text editor.
 You are looking for:
 
 	###
-	Compiler Family
+	# Chip Selection
 	#
 
-	#| Specify the compiler family to use
-	#| Currently only supports AVR and ARM
-	#| "avr"       # Teensy   1.0
-	#| "avr"       # Teensy   2.0
-	#| "avr"       # Teensy++ 1.0
-	#| "avr"       # Teensy++ 2.0
-	#| "arm"       # Teensy   3.0
-	#| "arm"       # Teensy   3.1
-
-	set( COMPILER_FAMILY "avr" )
-
-
-Just change the COMPILER_FAMILY variable to whatever you are trying to build for.
-
-NOTE: If you change this option, you will *may* to delete the build directory that is created in the Building sections below.
-
-
-
-----------------------
-Selecting Microcontroller
-----------------------
-
-Even if you selected the "avr" family of microcontroller architectures, you will still need to specify a target microcontroller (or once more ARM microcontrollers are supported).
-
-Open up avr.cmake (or arm.cmake) in your favourite text editor.
-You are looking for:
+	#| You _MUST_ set this to match the microcontroller you are trying to compile for
+	#| You _MUST_ clean the build directory if you change this value
+	#|
+	set( CHIP
+	#	"at90usb162"       # Teensy   1.0 (avr)
+	#	"atmega32u4"       # Teensy   2.0 (avr)
+	#	"at90usb646"       # Teensy++ 1.0 (avr)
+		"at90usb1286"      # Teensy++ 2.0 (avr)
+	#	"mk20dx128"        # Teensy   3.0 (arm)
+	#	"mk20dx256"        # Teensy   3.1 (arm)
+	)
 
-	###
-	# Atmel Defines and Linker Options
-	#
-
-	#| MCU Name
-	#| You _MUST_ set this to match the board you are using
-	#| type "make clean" after changing this, so all files will be rebuilt
-	#|
-	#| "at90usb162"       # Teensy   1.0
-	#| "atmega32u4"       # Teensy   2.0
-	#| "at90usb646"       # Teensy++ 1.0
-	#| "at90usb1286"      # Teensy++ 2.0
-
-	set( MCU "at90usb1286" )
-
-*OR*
-
-	###
-	# ARM Defines and Linker Options
-	#
-
-	#| Chip Name (Linker)
-	#| You _MUST_ set this to match the board you are using
-	#| type "make clean" after changing this, so all files will be rebuilt
-	#|
-	#| "mk20dx128"        # Teensy   3.0
-	#| "mk20dx256"        # Teensy   3.1
-
-	set( CHIP "mk20dx128" )
-
-
-Just change the CHIP variable to the microcontroller you are trying to build for.
+Just uncomment the chip you want, and comment out the old one.
 
 NOTE: If you change this option, you will *need* to delete the build directory that is created in the Building sections below.
 
@@ -201,7 +149,7 @@
 
 
 
-Open up setup.cmake in your favourite text editor.
+Open up CMakeLists.txt in your favourite text editor.
 Look for:
 
 	###
--- a/arm.cmake	Fri Apr 18 21:58:14 2014 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-###| CMAKE Kiibohd Controller |###
-#
-# Jacob Alexander 2011-2014
-# Due to this file's usefulness:
-#
-# Released into the Public Domain
-#
-# Freescale ARM CMake Build Configuration
-#
-###
-
-
-
-#| Set the Compilers (must be set first)
-include( CMakeForceCompiler )
-cmake_force_c_compiler  ( arm-none-eabi-gcc ARMCCompiler )
-cmake_force_cxx_compiler( arm-none-eabi-g++ ARMCxxCompiler )
-set( _CMAKE_TOOLCHAIN_PREFIX arm-none-eabi- )
-
-
-
-###
-# ARM Defines and Linker Options
-#
-
-#| Chip Name (Linker)
-#| You _MUST_ set this to match the board you are using
-#| type "make clean" after changing this, so all files will be rebuilt
-#|
-#| "mk20dx128"        # Teensy   3.0
-#| "mk20dx256"        # Teensy   3.1
-#set( CHIP "mk20dx128" )
-set( CHIP "mk20dx256" )
-
-message( STATUS "Chip Selected:" )
-message( "${CHIP}" )
-set( MCU "${CHIP}" ) # For loading script compatibility
-
-
-#| Chip Base Type
-#| Automatically chosed based on the chip name.
-if ( "${CHIP}" MATCHES "^mk20dx.*$" )
-	set( CHIP_FAMILY "mk20dx" )
-	message( STATUS "Chip Family:" )
-	message( "${CHIP_FAMILY}" )
-else ()
-	message( FATAL_ERROR "Unknown chip family: ${CHIP}" )
-endif ()
-
-
-#| CPU Type
-#| You _MUST_ set this to match the board you are using
-#| type "make clean" after changing this, so all files will be rebuilt
-#|
-#| "cortex-m4"        # Teensy   3.0, 3.1
-set( CPU "cortex-m4" )
-
-message( STATUS "CPU Selected:" )
-message( "${CPU}" )
-
-
-#| Extra Compiler Sources
-#| Mostly for convenience functions like interrupt handlers
-set( COMPILER_SRCS
-	Lib/${CHIP_FAMILY}.c
-	Lib/delay.c
-)
-
-message( STATUS "Compiler Source Files:" )
-message( "${COMPILER_SRCS}" )
-
-
-#| USB Defines
-set( VENDOR_ID  "0x16C0" )
-set( PRODUCT_ID "0x0487" )
-
-
-#| Compiler flag to set the C Standard level.
-#|     c89   = "ANSI" C
-#|     gnu89 = c89 plus GCC extensions
-#|     c99   = ISO C99 standard (not yet fully implemented)
-#|     gnu99 = c99 plus GCC extensions
-set( CSTANDARD "-std=gnu99" )
-
-
-#| Warning Options
-#|  -Wall...:     warning level
-set( WARN "-Wall -g" )
-
-
-#| Tuning Options
-#|  -f...:        tuning, see GCC manual
-#| NOTE: -fshort-wchar is specified to allow USB strings be passed conveniently
-set( TUNING "-mthumb -nostdlib -fdata-sections -ffunction-sections -fshort-wchar" )
-
-
-#| Optimization level, can be [0, 1, 2, 3, s].
-#|     0 = turn off optimization. s = optimize for size.
-#|     (Note: 3 is not always the best optimization level.)
-set( OPT "s" )
-
-
-#| Output Format
-#| srec, ihex, binary
-set( FORMAT "ihex" )
-
-
-#| Processor frequency.
-#|   Normally the first thing your program should do is set the clock prescaler,
-#|   so your program will run at the correct speed.  You should also set this
-#|   variable to same clock speed.  The _delay_ms() macro uses this, and many
-#|   examples use this variable to calculate timings.  Do not add a "UL" here.
-set( F_CPU "48000000" )
-
-
-#| Dependency Files
-#| Compiler flags to generate dependency files.
-set( GENDEPFLAGS "-MMD" )
-
-
-#| Compiler Flags
-add_definitions( "-mcpu=${CPU} -DF_CPU=${F_CPU} -D_${CHIP}_=1 -O${OPT} ${TUNING} ${WARN} ${CSTANDARD} ${GENDEPFLAGS}" )
-
-
-#| Linker Flags
-set( LINKER_FLAGS "-mcpu=${CPU} -Wl,-Map=${TARGET}.map,--cref -Wl,--gc-sections -mthumb -Wl,--no-wchar-size-warning -T${CMAKE_CURRENT_SOURCE_DIR}/Lib/${CHIP}.ld" )
-
-
-#| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...)
-set( HEX_FLAGS -O ${FORMAT} -R .eeprom )
-
-
-#| Lss Flags
-set( LSS_FLAGS -h -S -z )
-
--- a/avr.cmake	Fri Apr 18 21:58:14 2014 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-###| CMAKE Kiibohd Controller |###
-#
-# Jacob Alexander 2011-2014
-# Due to this file's usefulness:
-#
-# Released into the Public Domain
-#
-# avr-gcc CMake Build Configuration
-#
-###
-
-
-
-#| Set the Compilers (must be set first)
-include( CMakeForceCompiler )
-cmake_force_c_compiler  ( avr-gcc AVRCCompiler )
-cmake_force_cxx_compiler( avr-g++ AVRCxxCompiler )
-set( _CMAKE_TOOLCHAIN_PREFIX avr- )
-
-
-
-###
-# Atmel Defines and Linker Options
-#
-
-#| MCU Name
-#| You _MUST_ set this to match the board you are using
-#| type "make clean" after changing this, so all files will be rebuilt
-#|
-#| "at90usb162"       # Teensy   1.0
-#| "atmega32u4"       # Teensy   2.0
-#| "at90usb646"       # Teensy++ 1.0
-#| "at90usb1286"      # Teensy++ 2.0
-#set( MCU "atmega32u4" )
-set( MCU "at90usb1286" )
-
-message( STATUS "MCU Selected:" )
-message( "${MCU}" )
-
-
-#| Extra Compiler Sources
-#| Mostly for convenience functions like interrupt handlers
-set( COMPILER_SRCS
-	# XXX Not needed for avr-gcc
-)
-
-
-#| CPU Type
-#| This is only informational for AVR microcontrollers
-#| The field can be determined by the microcontroller chip, but currently only one CPU type is used atm
-set( CPU "megaAVR" )
-
-message( STATUS "CPU Selected:" )
-message( "${CPU}" )
-
-
-#| USB Defines
-set( VENDOR_ID  "0x16C0" )
-set( PRODUCT_ID "0x047D" )
-
-
-#| Compiler flag to set the C Standard level.
-#|     c89   = "ANSI" C
-#|     gnu89 = c89 plus GCC extensions
-#|     c99   = ISO C99 standard (not yet fully implemented)
-#|     gnu99 = c99 plus GCC extensions
-set( CSTANDARD "-std=gnu99" )
-
-
-#| Warning Options
-#|  -Wall...:     warning level
-set( WARN "-Wall" )
-
-
-#| Tuning Options
-#|  -f...:        tuning, see GCC manual and avr-libc documentation
-#| NOTE: -fshort-wchar is specified to allow USB strings be passed conveniently
-set( TUNING "-funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums" )
-
-
-#| Optimization level, can be [0, 1, 2, 3, s].
-#|     0 = turn off optimization. s = optimize for size.
-#|     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
-set( OPT "s" )
-
-
-#| Output Format
-#| srec, ihex, binary
-set( FORMAT "ihex" )
-
-
-#| Processor frequency.
-#|   Normally the first thing your program should do is set the clock prescaler,
-#|   so your program will run at the correct speed.  You should also set this
-#|   variable to same clock speed.  The _delay_ms() macro uses this, and many
-#|   examples use this variable to calculate timings.  Do not add a "UL" here.
-set( F_CPU "16000000" )
-
-
-#| Dependency Files
-#| Compiler flags to generate dependency files.
-set( GENDEPFLAGS "-MMD -MP" )
-
-
-#| Compiler Flags
-add_definitions( "-mmcu=${MCU} -DF_CPU=${F_CPU} -D_${MCU}_=1 -O${OPT} ${TUNING} ${WARN} ${CSTANDARD} ${GENDEPFLAGS}" )
-
-
-#| Linker Flags
-set( LINKER_FLAGS "-mmcu=${MCU} -Wl,-Map=${TARGET}.map,--cref -Wl,--relax -Wl,--gc-sections" )
-
-
-#| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...)
-set( HEX_FLAGS -O ${FORMAT} -R .eeprom -R .fuse -R .lock -R .signature )
-
-
-#| Eep Flags (XXX, I've removed this target from the builds, but keeping the set line as a note)
-set( EEP_FLAGS -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ${FORMAT} )
-
-
-#| Lss Flags
-set( LSS_FLAGS -h -S -z )
-
--- a/setup.cmake	Fri Apr 18 21:58:14 2014 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,247 +0,0 @@
-###| CMAKE Kiibohd Controller Source Configurator |###
-#
-# Written by Jacob Alexander in 2011-2014 for the Kiibohd Controller
-#
-# Released into the Public Domain
-#
-###
-
-
-
-###
-# Project Modules
-#
-
-#| Note: This is the only section you probably want to modify
-#| Each module is defined by it's own folder (e.g. Scan/Matrix represents the "Matrix" module)
-#| All of the modules must be specified, as they generate the sources list of files to compile
-#| Any modifications to this file will cause a complete rebuild of the project
-
-#| Please look at the {Scan,Macro,USB,Debug}/module.txt for information on the modules and how to create new ones
-
-##| Deals with acquiring the keypress information and turning it into a key index
-set(   ScanModule "DPH" )
-
-##| Provides the mapping functions for DefaultMap and handles any macro processing before sending to the OutputModule
-set(  MacroModule "PartialMap" )
-
-##| Sends the current list of usb key codes through USB HID
-set( OutputModule "pjrcUSB" )
-
-##| Debugging source to use, each module has it's own set of defines that it sets
-set(  DebugModule "full" )
-
-
-
-###
-# Keymap Configuration
-#
-
-##| If there are multiple DefaultMaps, it is defined here. If, the specified DefaultMap is not found, defaultMap.h is used.
-set(   DefaultMap "kishsaver" )
-
-##| PartialMap combined keymap layering. The first keymap has the "least" precedence.
-set(  CombinedMap colemak capslock2ctrl )
-
-##| ParitalMaps available on top of the CombinedMap. If there are input conflicts, the last PartialMap takes precedence.
-set(  PartialMaps hhkbnav kbdctrl )
-
-##| MacroSets define extra capabilities that are not provided by the Scan or Output modules. Last MacroSet takes precedence.
-set(    MacroSets retype )
-
-
-###
-# Module Overrides (Used in the buildall.bash script)
-#
-if ( ( DEFINED ScanModuleOverride ) AND ( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Scan/${ScanModuleOverride} ) )
-	set( ScanModule ${ScanModuleOverride} )
-endif ()
-
-
-
-###
-# Path Setup
-#
-set(  ScanModulePath    "Scan/${ScanModule}"   )
-set( MacroModulePath   "Macro/${MacroModule}"  )
-set( OutputModulePath "Output/${OutputModule}" )
-set( DebugModulePath   "Debug/${DebugModule}"  )
-
-#| Top-level directory adjustment
-set( HEAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
-
-
-
-###
-# 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()
-		endif ()
-	endforeach()
-
-	message( FATAL_ERROR "${ModulePath} does not support the ${COMPILER_FAMILY} family..." )
-endfunction()
-
-
-
-###
-# Module Configuration
-#
-
-#| Additional options, usually define settings
-add_definitions()
-
-#| Include path for each of the modules
-add_definitions(
-	-I${HEAD_DIR}/${ScanModulePath}
-	-I${HEAD_DIR}/${MacroModulePath}
-	-I${HEAD_DIR}/${OutputModulePath}
-	-I${HEAD_DIR}/${DebugModulePath}
-)
-
-
-
-
-###
-# 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} )
-		# Set the path
-		set( tmpSource ${tmpSource} "${SourcesPath}/${item}" )
-	endforeach()
-
-	# Finalize by writing the new list back over the old one
-	set( ${Output} ${tmpSource} )
-endmacro()
-
-
-#| Scan Module
-include    (            "${ScanModulePath}/setup.cmake"  )
-PathPrepend(  SCAN_SRCS  ${ScanModulePath} ${SCAN_SRCS}  )
-
-#| Macro Module
-include    (           "${MacroModulePath}/setup.cmake"  )
-PathPrepend( MACRO_SRCS ${MacroModulePath} ${MACRO_SRCS} )
-
-#| Output Module
-include    (             "${OutputModulePath}/setup.cmake"   )
-PathPrepend( OUTPUT_SRCS  ${OutputModulePath} ${OUTPUT_SRCS} )
-
-#| Debugging Module
-include    (           "${DebugModulePath}/setup.cmake"  )
-PathPrepend( DEBUG_SRCS ${DebugModulePath} ${DEBUG_SRCS} )
-
-
-#| Default Map
-# TODO Add support for different defaultMaps
-configure_file( "${ScanModulePath}/defaultMap.h" defaultMap.h )
-
-
-#| Print list of all module sources
-message( STATUS "Detected Scan Module Source Files:" )
-message( "${SCAN_SRCS}" )
-message( STATUS "Detected Macro Module Source Files:" )
-message( "${MACRO_SRCS}" )
-message( STATUS "Detected Output Module Source Files:" )
-message( "${OUTPUT_SRCS}" )
-message( STATUS "Detected Debug Module Source Files:" )
-message( "${DEBUG_SRCS}" )
-
-
-
-###
-# 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
-#| Takes a bit of work to extract the "M " using CMake, and not using it if there are no modifications
-execute_process( COMMAND git status -s -uno --porcelain
-	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-	OUTPUT_VARIABLE Git_Modified_INFO
-	ERROR_QUIET
-	OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-string( LENGTH "${Git_Modified_INFO}" Git_Modified_LENGTH )
-set( Git_Modified_Status "Clean" )
-if ( ${Git_Modified_LENGTH} GREATER 2 )
-	string( SUBSTRING "${Git_Modified_INFO}" 1 2 Git_Modified_Flag_INFO )
-	set( Git_Modified_Status "Dirty" )
-endif ()
-
-#| Branch
-execute_process( COMMAND git rev-parse --abbrev-ref HEAD
-	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-	OUTPUT_VARIABLE Git_Branch_INFO
-	ERROR_QUIET
-	OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-#| Date
-execute_process( COMMAND git show -s --format=%ci
-	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-	OUTPUT_VARIABLE Git_Date_INFO
-	ERROR_QUIET
-	OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-#| Commit Author and Email
-execute_process( COMMAND git show -s --format="%cn <%ce>"
-	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-	OUTPUT_VARIABLE Git_Commit_Author
-	ERROR_QUIET
-	OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-#| Commit Revision
-execute_process( COMMAND git show -s --format=%H
-	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-	OUTPUT_VARIABLE Git_Commit_Revision
-	ERROR_QUIET
-	OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-#| Origin URL
-execute_process( COMMAND git config --get remote.origin.url
-	WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-	OUTPUT_VARIABLE Git_Origin_URL
-	ERROR_QUIET
-	OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-#| Build Date
-execute_process( COMMAND "date" "+%Y-%m-%d %T %z"
-	OUTPUT_VARIABLE Build_Date
-	ERROR_QUIET
-	OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-#| Last Commit Date
-set( GitLastCommitDate "${Git_Modified_Status} ${Git_Branch_INFO} - ${Git_Date_INFO}" )
-
-#| Uses CMake variables to include as defines
-#| Primarily for USB configuration
-configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Lib/_buildvars.h buildvars.h )
-