Reorganizing CMake build system.

- Only one file to edit now
- Compiler architecture automatically detected based off of chip target
This commit is contained in:
Jacob Alexander 2014-04-18 22:57:14 -07:00
parent cfea1de2e8
commit 38266ca2cc
6 changed files with 234 additions and 246 deletions

View file

@ -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 )