From 38266ca2ccb4e76d6827e893ce57cc1dbf3fba88 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Fri, 18 Apr 2014 22:57:14 -0700 Subject: [PATCH] Reorganizing CMake build system. - Only one file to edit now - Compiler architecture automatically detected based off of chip target --- CMakeLists.txt | 195 +++++++++---------------- arm.cmake => Lib/CMake/arm.cmake | 4 - avr.cmake => Lib/CMake/avr.cmake | 6 +- Lib/CMake/initialize.cmake | 42 ++++++ setup.cmake => Lib/CMake/modules.cmake | 149 +++++++++++++------ README | 84 ++--------- 6 files changed, 234 insertions(+), 246 deletions(-) rename arm.cmake => Lib/CMake/arm.cmake (94%) rename avr.cmake => Lib/CMake/avr.cmake (94%) create mode 100644 Lib/CMake/initialize.cmake rename setup.cmake => Lib/CMake/modules.cmake (67%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d20d85..27aea4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 Family +# Compiler Intialization +# +include( Lib/CMake/initialize.cmake ) + + + +### +# 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 -message( STATUS "Compiler Family:" ) -message( "${COMPILER_FAMILY}" ) +#| 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" ) -#| Load the compiler family specific configurations -include( ${COMPILER_FAMILY}.cmake ) +### +# Keymap Configuration (XXX - Not worky yet, currently ignored) +# -#| Binutils not set by CMake -set( CMAKE_SIZE "${_CMAKE_TOOLCHAIN_PREFIX}size" ) +##| 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 ) + + + +### +# Source Defines (in addition to the selected Modules) +# +set( MAIN_SRCS + main.c +) @@ -57,113 +102,7 @@ cmake_minimum_required( VERSION 2.8 ) ### -# 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} ) - - -#| .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() +include( Lib/CMake/modules.cmake ) diff --git a/arm.cmake b/Lib/CMake/arm.cmake similarity index 94% rename from arm.cmake rename to Lib/CMake/arm.cmake index d11b89f..6045afc 100644 --- a/arm.cmake +++ b/Lib/CMake/arm.cmake @@ -24,13 +24,9 @@ set( _CMAKE_TOOLCHAIN_PREFIX arm-none-eabi- ) # #| 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}" ) diff --git a/avr.cmake b/Lib/CMake/avr.cmake similarity index 94% rename from avr.cmake rename to Lib/CMake/avr.cmake index 0af5216..b191fe7 100644 --- a/avr.cmake +++ b/Lib/CMake/avr.cmake @@ -24,15 +24,13 @@ set( _CMAKE_TOOLCHAIN_PREFIX avr- ) # #| 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" ) + +set( MCU "${CHIP}" ) message( STATUS "MCU Selected:" ) message( "${MCU}" ) diff --git a/Lib/CMake/initialize.cmake b/Lib/CMake/initialize.cmake new file mode 100644 index 0000000..9f01b3a --- /dev/null +++ b/Lib/CMake/initialize.cmake @@ -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 --git a/setup.cmake b/Lib/CMake/modules.cmake similarity index 67% rename from setup.cmake rename to Lib/CMake/modules.cmake index 4324b0f..dad2edb 100644 --- a/setup.cmake +++ b/Lib/CMake/modules.cmake @@ -8,48 +8,6 @@ -### -# 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) # @@ -245,3 +203,110 @@ set( GitLastCommitDate "${Git_Modified_Status} ${Git_Branch_INFO} - ${Git_Date_I #| 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 --git a/README b/README index b9fc3a9..27df1cb 100644 --- a/README +++ b/README @@ -81,84 +81,32 @@ Use the installer and make sure you add the binaries to your path within the ins ---------------------- -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: - - ### - # 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 + #| 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 #| - #| "at90usb162" # Teensy 1.0 - #| "atmega32u4" # Teensy 2.0 - #| "at90usb646" # Teensy++ 1.0 - #| "at90usb1286" # Teensy++ 2.0 + 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( 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 @@ The Debug Module enables various things like the Teensy LED on errors, debug ter -Open up setup.cmake in your favourite text editor. +Open up CMakeLists.txt in your favourite text editor. Look for: ###