# HG changeset patch # User Jacob Alexander # Date 1397887034 25200 # Node ID 95da03b438603604b77f1ade57236ea4d8762b3f # Parent 9a8eb9fbf1771861bc527f814e0562d8d5bba3de Reorganizing CMake build system. - Only one file to edit now - Compiler architecture automatically detected based off of chip target diff -r 9a8eb9fbf177 -r 95da03b43860 CMakeLists.txt --- 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() - diff -r 9a8eb9fbf177 -r 95da03b43860 Lib/CMake/arm.cmake --- /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 ) + diff -r 9a8eb9fbf177 -r 95da03b43860 Lib/CMake/avr.cmake --- /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 ) + diff -r 9a8eb9fbf177 -r 95da03b43860 Lib/CMake/initialize.cmake --- /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" ) + diff -r 9a8eb9fbf177 -r 95da03b43860 Lib/CMake/modules.cmake --- /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 ) +#| 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 ) +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() + + diff -r 9a8eb9fbf177 -r 95da03b43860 README --- 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: ### diff -r 9a8eb9fbf177 -r 95da03b43860 arm.cmake --- 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 ) - diff -r 9a8eb9fbf177 -r 95da03b43860 avr.cmake --- 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 ) - diff -r 9a8eb9fbf177 -r 95da03b43860 setup.cmake --- 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 ) -#| 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 ) -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 ) -