#
###
-#| Windows / Cygwin Compatibility options
-set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
-set( CMAKE_USE_RELATIVE_PATHS 1 )
-
###
-# 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 "arm" )
-set( COMPILER_FAMILY "avr" )
-
-message( STATUS "Compiler Family:" )
-message( "${COMPILER_FAMILY}" )
-
-
-
-#| Load the compiler family specific configurations
-include( ${COMPILER_FAMILY}.cmake )
-
-#| Binutils not set by CMake
-set( CMAKE_SIZE "${_CMAKE_TOOLCHAIN_PREFIX}size" )
+#| 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)
+)
###
-# Project Description
+# Compiler Intialization
#
-
-#| Project
-project( kiibohd_controller )
-
-#| Target Name (output name)
-set( TARGET kiibohd )
-
-#| General Settings
-cmake_minimum_required( VERSION 2.8 )
+include( Lib/CMake/initialize.cmake )
###
-# Source Defines
+# Project Modules
#
-#| 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} )
+#| 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" )
-###
-# 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} )
+##| 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" )
-###
-# CMake Module Checking
-#
-find_package( Git REQUIRED )
###
-# Build Targets
+# Keymap Configuration (XXX - Not worky yet, currently ignored)
#
-#| 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
-)
+##| 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 )
-#| 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}"
-)
+##| 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 )
-#| 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}"
+###
+# Source Defines (in addition to the selected Modules)
+#
+set( MAIN_SRCS
+ main.c
)
###
-# Size Information
+# Project Description
#
-#| 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)"
-)
+#| Project
+project( kiibohd_controller )
+#| Target Name (output name)
+set( TARGET kiibohd )
+#| General Settings
+cmake_minimum_required( VERSION 2.8 )
-###
-# 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()
+###
+# Module Initialization / Compilation / Targets
+#
+include( Lib/CMake/modules.cmake )
--- /dev/null
+###| 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
+###| 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
+###| 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
+###| 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()
+
+
-----------------------
-Selecting Architecture
-----------------------
-
-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
-
-Open up CMakeLists.txt in your favourite text editor.
-You are looking for:
-
- ###
- Compiler Family
- #
-
- #| 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).
+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 avr.cmake (or arm.cmake) in your favourite text editor.
+Open up CMakeLists.txt in your favourite text editor.
You are looking for:
###
- # 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 Selection
#
- #| 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
+ #| 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
#|
- #| "mk20dx128" # Teensy 3.0
- #| "mk20dx256" # Teensy 3.1
+ 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)
+ )
- 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.
-Open up setup.cmake in your favourite text editor.
+Open up CMakeLists.txt in your favourite text editor.
Look for:
###
+++ /dev/null
-###| 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 )
-
+++ /dev/null
-###| 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 )
-
+++ /dev/null
-###| 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 )
-