Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on May 4, 2019. It is now read-only.

Refactoring: Prefer script-driven approach over function-driven approach #12

Merged
merged 8 commits into from
Oct 28, 2017
366 changes: 6 additions & 360 deletions cmake/Platform/Arduino.cmake

Large diffs are not rendered by default.

71 changes: 71 additions & 0 deletions cmake/Platform/Extras/CalculateFirmwareSize.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
set(AVRSIZE_PROGRAM "PLACEHOLDER_1")
set(AVRSIZE_FLAGS -C --mcu=${MCU})
execute_process(COMMAND ${AVRSIZE_PROGRAM} ${AVRSIZE_FLAGS} ${FIRMWARE_IMAGE} ${EEPROM_IMAGE}
OUTPUT_VARIABLE SIZE_OUTPUT)

string(STRIP "${SIZE_OUTPUT}" RAW_SIZE_OUTPUT)

# Convert lines into a list
string(REPLACE "\n" ";" SIZE_OUTPUT_LIST "${SIZE_OUTPUT}")

set(SIZE_OUTPUT_LINES)
foreach (LINE ${SIZE_OUTPUT_LIST})
if (NOT "${LINE}" STREQUAL "")
list(APPEND SIZE_OUTPUT_LINES "${LINE}")
endif ()
endforeach ()

function(EXTRACT LIST_NAME INDEX VARIABLE)
list(GET "${LIST_NAME}" ${INDEX} RAW_VALUE)
string(STRIP "${RAW_VALUE}" VALUE)
set(${VARIABLE} "${VALUE}" PARENT_SCOPE)
endfunction()

function(PARSE INPUT VARIABLE_PREFIX)
if (${INPUT} MATCHES "([^:]+):[ \t]*([0-9]+)[ \t]*([^ \t]+)[ \t]*[(]([0-9.]+)%.*")
set(ENTRY_NAME ${CMAKE_MATCH_1})
set(ENTRY_SIZE ${CMAKE_MATCH_2})
set(ENTRY_SIZE_TYPE ${CMAKE_MATCH_3})
set(ENTRY_PERCENT ${CMAKE_MATCH_4})
endif ()

set(${VARIABLE_PREFIX}_NAME ${ENTRY_NAME} PARENT_SCOPE)
set(${VARIABLE_PREFIX}_SIZE ${ENTRY_SIZE} PARENT_SCOPE)
set(${VARIABLE_PREFIX}_SIZE_TYPE ${ENTRY_SIZE_TYPE} PARENT_SCOPE)
set(${VARIABLE_PREFIX}_PERCENT ${ENTRY_PERCENT} PARENT_SCOPE)
endfunction()

list(LENGTH SIZE_OUTPUT_LINES SIZE_OUTPUT_LENGTH)

if (${SIZE_OUTPUT_LENGTH} STREQUAL 14)
EXTRACT(SIZE_OUTPUT_LINES 3 FIRMWARE_PROGRAM_SIZE_ROW)
EXTRACT(SIZE_OUTPUT_LINES 5 FIRMWARE_DATA_SIZE_ROW)
PARSE(FIRMWARE_PROGRAM_SIZE_ROW FIRMWARE_PROGRAM)
PARSE(FIRMWARE_DATA_SIZE_ROW FIRMWARE_DATA)

set(FIRMWARE_STATUS "Firmware Size: ")
set(FIRMWARE_STATUS "${FIRMWARE_STATUS} [${FIRMWARE_PROGRAM_NAME}: ${FIRMWARE_PROGRAM_SIZE} ${FIRMWARE_PROGRAM_SIZE_TYPE} (${FIRMWARE_PROGRAM_PERCENT}%) ] ")
set(FIRMWARE_STATUS "${FIRMWARE_STATUS} [${FIRMWARE_DATA_NAME}: ${FIRMWARE_DATA_SIZE} ${FIRMWARE_DATA_SIZE_TYPE} (${FIRMWARE_DATA_PERCENT}%) ]")
set(FIRMWARE_STATUS "${FIRMWARE_STATUS} on ${MCU}")

EXTRACT(SIZE_OUTPUT_LINES 10 EEPROM_PROGRAM_SIZE_ROW)
EXTRACT(SIZE_OUTPUT_LINES 12 EEPROM_DATA_SIZE_ROW)
PARSE(EEPROM_PROGRAM_SIZE_ROW EEPROM_PROGRAM)
PARSE(EEPROM_DATA_SIZE_ROW EEPROM_DATA)

set(EEPROM_STATUS "EEPROM Size: ")
set(EEPROM_STATUS "${EEPROM_STATUS} [${EEPROM_PROGRAM_NAME}: ${EEPROM_PROGRAM_SIZE} ${EEPROM_PROGRAM_SIZE_TYPE} (${EEPROM_PROGRAM_PERCENT}%) ] ")
set(EEPROM_STATUS "${EEPROM_STATUS} [${EEPROM_DATA_NAME}: ${EEPROM_DATA_SIZE} ${EEPROM_DATA_SIZE_TYPE} (${EEPROM_DATA_PERCENT}%) ]")
set(EEPROM_STATUS "${EEPROM_STATUS} on ${MCU}")

message("${FIRMWARE_STATUS}")
message("${EEPROM_STATUS}\n")

if ($ENV{VERBOSE})
message("${RAW_SIZE_OUTPUT}\n")
elseif (\$ENV{VERBOSE_SIZE})
message("${RAW_SIZE_OUTPUT}\n")
endif ()
else ()
message("${RAW_SIZE_OUTPUT}")
endif ()
16 changes: 0 additions & 16 deletions cmake/Platform/Initialization/ArduinoSettings.cmake

This file was deleted.

14 changes: 14 additions & 0 deletions cmake/Platform/Initialization/DefineAdvancedVariables.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
mark_as_advanced(
ARDUINO_CORES_PATH
ARDUINO_VARIANTS_PATH
ARDUINO_BOOTLOADERS_PATH
ARDUINO_LIBRARIES_PATH
ARDUINO_BOARDS_PATH
ARDUINO_PROGRAMMERS_PATH
ARDUINO_VERSION_PATH
ARDUINO_AVRDUDE_FLAGS
ARDUINO_AVRDUDE_PROGRAM
ARDUINO_AVRDUDE_CONFIG_PATH
ARDUINO_OBJCOPY_EEP_FLAGS
ARDUINO_OBJCOPY_HEX_FLAGS
AVRSIZE_PROGRAM)
46 changes: 46 additions & 0 deletions cmake/Platform/Initialization/DetectVersion.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#=============================================================================#
# Detects the Arduino SDK Version based on the revisions.txt file.
# The following variables will be generated:
#
# ${OUTPUT_VAR_NAME} -> the full version (major.minor.patch)
# ${OUTPUT_VAR_NAME}_MAJOR -> the major version
# ${OUTPUT_VAR_NAME}_MINOR -> the minor version
# ${OUTPUT_VAR_NAME}_PATCH -> the patch version
#
#=============================================================================#
find_file(ARDUINO_VERSION_PATH
NAMES lib/version.txt
PATHS ${ARDUINO_SDK_PATH}
DOC "Path to Arduino version file.")

if (NOT ARDUINO_VERSION_PATH)
message(FATAL_ERROR "Couldn't find SDK's version file, aborting.")
return()
endif ()

file(READ ${ARDUINO_VERSION_PATH} RAW_VERSION)
if ("${RAW_VERSION}" MATCHES " *[0]+([0-9]+)")
set(PARSED_VERSION 0.${CMAKE_MATCH_1}.0)
elseif ("${RAW_VERSION}" MATCHES "[ ]*([0-9]+[.][0-9]+[.][0-9]+)")
set(PARSED_VERSION ${CMAKE_MATCH_1})
elseif ("${RAW_VERSION}" MATCHES "[ ]*([0-9]+[.][0-9]+)")
set(PARSED_VERSION ${CMAKE_MATCH_1}.0)
endif ()

if (NOT PARSED_VERSION STREQUAL "")
string(REPLACE "." ";" SPLIT_VERSION ${PARSED_VERSION})
list(GET SPLIT_VERSION 0 SPLIT_VERSION_MAJOR)
list(GET SPLIT_VERSION 1 SPLIT_VERSION_MINOR)
list(GET SPLIT_VERSION 2 SPLIT_VERSION_PATCH)

set(ARDUINO_SDK_VERSION "${PARSED_VERSION}" CACHE STRING "Arduino SDK Version")
set(ARDUINO_SDK_VERSION_MAJOR ${ARDUINO_SDK_VERSION_MAJOR} CACHE STRING "Arduino SDK Major Version")
set(ARDUINO_SDK_VERSION_MINOR ${ARDUINO_SDK_VERSION_MINOR} CACHE STRING "Arduino SDK Minor Version")
set(ARDUINO_SDK_VERSION_PATCH ${ARDUINO_SDK_VERSION_PATCH} CACHE STRING "Arduino SDK Patch Version")
endif ()

if (ARDUINO_SDK_VERSION VERSION_LESS 0.19)
message(FATAL_ERROR "Unsupported Arduino SDK (requires version 0.19 or higher)")
endif ()

message(STATUS "Arduino SDK version ${ARDUINO_SDK_VERSION}: ${ARDUINO_SDK_PATH}")
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,5 @@ if (NOT CMAKE_OBJCOPY)
endif (NOT CMAKE_OBJCOPY)

if (EXISTS "${ARDUINO_EXAMPLES_PATH}")
load_arduino_examples_categories()
include(SetupExampleCategories)
endif ()
74 changes: 10 additions & 64 deletions cmake/Platform/Initialization/Initializer.cmake
Original file line number Diff line number Diff line change
@@ -1,77 +1,23 @@
include(${CMAKE_CURRENT_LIST_DIR}/CompilerSettings.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/ArduinoSettings.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/VersionDetector.cmake)

#=============================================================================#
# Initialization
#=============================================================================#
setup_compiler_settings()
setup_arduino_settings()

if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH)

find_file(ARDUINO_VERSION_PATH
NAMES lib/version.txt
PATHS ${ARDUINO_SDK_PATH}
DOC "Path to Arduino version file.")
include(SetupCompilerSettings)
include(SetupArduinoSettings)

# get version first (some stuff depends on versions)
detect_arduino_version(ARDUINO_SDK_VERSION)
set(ARDUINO_SDK_VERSION ${ARDUINO_SDK_VERSION} CACHE STRING "Arduino SDK Version")
set(ARDUINO_SDK_VERSION_MAJOR ${ARDUINO_SDK_VERSION_MAJOR} CACHE STRING "Arduino SDK Major Version")
set(ARDUINO_SDK_VERSION_MINOR ${ARDUINO_SDK_VERSION_MINOR} CACHE STRING "Arduino SDK Minor Version")
set(ARDUINO_SDK_VERSION_PATCH ${ARDUINO_SDK_VERSION_PATCH} CACHE STRING "Arduino SDK Patch Version")

if (ARDUINO_SDK_VERSION VERSION_LESS 0.19)
message(FATAL_ERROR "Unsupported Arduino SDK (requires version 0.19 or higher)")
endif ()

message(STATUS "Arduino SDK version ${ARDUINO_SDK_VERSION}: ${ARDUINO_SDK_PATH}")

register_hardware_platform(${ARDUINO_SDK_PATH}/hardware/arduino/)
include(DetectVersion)

include(${CMAKE_CURRENT_LIST_DIR}/ProgramFinder.cmake)
include(RegisterHardwarePlatform)
include(FindPrograms)
include(SetDefaults)
include(SetupFirmwareSizeScript)

set(ARDUINO_DEFAULT_BOARD uno CACHE STRING "Default Arduino Board ID when not specified.")
set(ARDUINO_DEFAULT_PORT CACHE STRING "Default Arduino port when not specified.")
set(ARDUINO_DEFAULT_SERIAL CACHE STRING "Default Arduino Serial command when not specified.")
set(ARDUINO_DEFAULT_PROGRAMMER CACHE STRING "Default Arduino Programmer ID when not specified.")

# Ensure that all required paths are found
required_variables(VARS
ARDUINO_PLATFORMS
ARDUINO_CORES_PATH
ARDUINO_BOOTLOADERS_PATH
ARDUINO_LIBRARIES_PATH
ARDUINO_BOARDS_PATH
ARDUINO_PROGRAMMERS_PATH
ARDUINO_VERSION_PATH
ARDUINO_AVRDUDE_FLAGS
ARDUINO_AVRDUDE_PROGRAM
ARDUINO_AVRDUDE_CONFIG_PATH
AVRSIZE_PROGRAM
${ADDITIONAL_REQUIRED_VARS}
MSG "Invalid Arduino SDK path (${ARDUINO_SDK_PATH}).\n")

setup_arduino_size_script(ARDUINO_SIZE_SCRIPT)
set(ARDUINO_SIZE_SCRIPT ${ARDUINO_SIZE_SCRIPT} CACHE INTERNAL "Arduino Size Script")

#print_board_list()
#print_programmer_list()
include(TestSetup)
include(DefineAdvancedVariables)

set(ARDUINO_FOUND True CACHE INTERNAL "Arduino Found")
mark_as_advanced(
ARDUINO_CORES_PATH
ARDUINO_VARIANTS_PATH
ARDUINO_BOOTLOADERS_PATH
ARDUINO_LIBRARIES_PATH
ARDUINO_BOARDS_PATH
ARDUINO_PROGRAMMERS_PATH
ARDUINO_VERSION_PATH
ARDUINO_AVRDUDE_FLAGS
ARDUINO_AVRDUDE_PROGRAM
ARDUINO_AVRDUDE_CONFIG_PATH
ARDUINO_OBJCOPY_EEP_FLAGS
ARDUINO_OBJCOPY_HEX_FLAGS
AVRSIZE_PROGRAM)

endif ()
134 changes: 134 additions & 0 deletions cmake/Platform/Initialization/LoadArduinoPlatformSettings.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
# SETTINGS_LIST - Variable name of settings list
# SETTINGS_PATH - File path of settings file to load.
#
# Loads an Arduino settings file into the cache.
#
# Examples of this type of settings file is the boards.txt and
# programmers.txt files located in ${ARDUINO_SDK}/hardware/arduino.
#
# Settings have to following format:
#
# entry.setting[.subsetting] = value
#
# where [.subsetting] is optional
#
# For example, the following settings:
#
# uno.name=Arduino Uno
# uno.upload.protocol=stk500
# uno.upload.maximum_size=32256
# uno.build.mcu=atmega328p
# uno.build.core=arduino
#
# will generate the follwoing equivalent CMake variables:
#
# set(uno.name "Arduino Uno")
# set(uno.upload.protocol "stk500")
# set(uno.upload.maximum_size "32256")
# set(uno.build.mcu "atmega328p")
# set(uno.build.core "arduino")
#
# set(uno.SETTINGS name upload build) # List of settings for uno
# set(uno.upload.SUBSETTINGS protocol maximum_size) # List of sub-settings for uno.upload
# set(uno.build.SUBSETTINGS mcu core) # List of sub-settings for uno.build
#
# Note that Arduino 1.6 SDK or greater treats most of the settings differently for some boards,
# by grouping them into menus which differentiate on their cpu architecture.
#
# For example, the settings declared earlier for "regular" SDKs
# would be declared as such in 1.6:
#
# mega.name=Arduino Uno
# mega.menu.cpu.atmega2560.upload.protocol=wiring
# mega.menu.cpu.atmega2560.upload.maximum_size=253952
# mega.menu.cpu.atmega2560.build.mcu=atmega2560
# mega.build.core=arduino
#
# The ${ENTRY_NAME}.SETTINGS variable lists all settings for the entry, while
# ${ENTRY_NAME}.SUBSETTINGS variables lists all settings for a sub-setting of
# a entry setting pair.
#
# These variables are generated in order to be able to programatically traverse
# all settings (for a example see print_board_settings() function).
#
#=============================================================================#
if (NOT ${SETTINGS_LIST} AND EXISTS ${SETTINGS_PATH})
file(STRINGS ${SETTINGS_PATH} FILE_ENTRIES) # Settings file split into lines

foreach (FILE_ENTRY ${FILE_ENTRIES})
if ("${FILE_ENTRY}" MATCHES "^[^#]+=.*")
string(REGEX MATCH "^[^=]+" SETTING_NAME ${FILE_ENTRY})
string(REGEX MATCH "[^=]+$" SETTING_VALUE ${FILE_ENTRY})
string(REPLACE "." ";" ENTRY_NAME_TOKENS ${SETTING_NAME})
string(STRIP "${SETTING_VALUE}" SETTING_VALUE)

list(LENGTH ENTRY_NAME_TOKENS ENTRY_NAME_TOKENS_LEN)

# Add entry to settings list if it does not exist
list(GET ENTRY_NAME_TOKENS 0 ENTRY_NAME)
list(FIND ${SETTINGS_LIST} ${ENTRY_NAME} ENTRY_NAME_INDEX)
if (ENTRY_NAME_INDEX LESS 0)
# Add entry to main list
list(APPEND ${SETTINGS_LIST} ${ENTRY_NAME})
endif ()

# Add entry setting to entry settings list if it does not exist
set(ENTRY_SETTING_LIST ${ENTRY_NAME}.SETTINGS)

# menu.cpu.architecture settings
if (ENTRY_NAME_TOKENS_LEN GREATER 5)
list(GET ENTRY_NAME_TOKENS 3 CPU_ARCH)
list(GET ENTRY_NAME_TOKENS 4 ENTRY_SETTING)
set(ENTRY_SETTING menu.cpu.${CPU_ARCH}.${ENTRY_SETTING})
else ()
list(GET ENTRY_NAME_TOKENS 1 ENTRY_SETTING)
endif ()

list(FIND ${ENTRY_SETTING_LIST} ${ENTRY_SETTING} ENTRY_SETTING_INDEX)
if (ENTRY_SETTING_INDEX LESS 0)
# Add setting to entry
list(APPEND ${ENTRY_SETTING_LIST} ${ENTRY_SETTING})
set(${ENTRY_SETTING_LIST} ${${ENTRY_SETTING_LIST}}
CACHE INTERNAL "Arduino ${ENTRY_NAME} Board settings list")
endif ()

set(FULL_SETTING_NAME ${ENTRY_NAME}.${ENTRY_SETTING})

# Add entry sub-setting to entry sub-settings list if it does not exists
if (ENTRY_NAME_TOKENS_LEN GREATER 2)

set(ENTRY_SUBSETTING_LIST ${ENTRY_NAME}.${ENTRY_SETTING}.SUBSETTINGS)
if (ENTRY_NAME_TOKENS_LEN GREATER 5)
list(GET ENTRY_NAME_TOKENS 5 ENTRY_SUBSETTING)
elseif (ENTRY_NAME_TOKENS_LEN GREATER 3)
# Search for special cpu sub-settings
list(GET ENTRY_NAME_TOKENS 2 ENTRY_SUBSETTING)
string(TOLOWER ${ENTRY_SUBSETTING} ENTRY_SUBSETTING)
if ("${ENTRY_SUBSETTING}" STREQUAL "cpu")
# cpu setting found, determine architecture
list(GET ENTRY_NAME_TOKENS 3 ENTRY_SUBSETTING)
set(ENTRY_SUBSETTING_LIST ${ENTRY_NAME}.${ENTRY_SETTING}.CPUS)
endif ()
else ()
list(GET ENTRY_NAME_TOKENS 2 ENTRY_SUBSETTING)
endif ()
list(FIND ${ENTRY_SUBSETTING_LIST} ${ENTRY_SUBSETTING} ENTRY_SUBSETTING_INDEX)
if (ENTRY_SUBSETTING_INDEX LESS 0)
list(APPEND ${ENTRY_SUBSETTING_LIST} ${ENTRY_SUBSETTING})
set(${ENTRY_SUBSETTING_LIST} ${${ENTRY_SUBSETTING_LIST}}
CACHE INTERNAL "Arduino ${ENTRY_NAME} Board sub-settings list")
endif ()
set(FULL_SETTING_NAME ${FULL_SETTING_NAME}.${ENTRY_SUBSETTING})

endif ()

# Save setting value
set(${FULL_SETTING_NAME} ${SETTING_VALUE}
CACHE INTERNAL "Arduino ${ENTRY_NAME} Board setting")

endif ()
endforeach ()
set(${SETTINGS_LIST} ${${SETTINGS_LIST}}
CACHE STRING "List of detected Arduino Board configurations")
mark_as_advanced(${SETTINGS_LIST})
endif ()
Loading