diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index 47e7c25..de9ea5f 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -726,99 +726,6 @@ endfunction() # Other Functions #=============================================================================# -#=============================================================================# -# REGISTER_HARDWARE_PLATFORM -# [PUBLIC/USER] -# see documentation at top -#=============================================================================# -function(REGISTER_HARDWARE_PLATFORM PLATFORM_PATH) - string(REGEX REPLACE "/$" "" PLATFORM_PATH ${PLATFORM_PATH}) - GET_FILENAME_COMPONENT(PLATFORM ${PLATFORM_PATH} NAME) - - # platform path changed in versions 1.5 and greater - if (ARDUINO_SDK_VERSION VERSION_GREATER 1.0.5) - set(PLATFORM_PATH "${PLATFORM_PATH}/avr") - endif () - - if (PLATFORM) - # Avoid defining a platform multiple times if it has already been defined before - string(TOUPPER ${PLATFORM} PLATFORM) - list(FIND ARDUINO_PLATFORMS ${PLATFORM} platform_exists) - - if (platform_exists EQUAL -1) - set(${PLATFORM}_PLATFORM_PATH ${PLATFORM_PATH} CACHE INTERNAL "The path to ${PLATFORM}") - set(ARDUINO_PLATFORMS ${ARDUINO_PLATFORMS} ${PLATFORM} CACHE INTERNAL "A list of registered platforms") - - find_file(${PLATFORM}_CORES_PATH - NAMES cores - PATHS ${PLATFORM_PATH} - DOC "Path to directory containing the Arduino core sources.") - - find_file(${PLATFORM}_VARIANTS_PATH - NAMES variants - PATHS ${PLATFORM_PATH} - DOC "Path to directory containing the Arduino variant sources.") - - find_file(${PLATFORM}_BOOTLOADERS_PATH - NAMES bootloaders - PATHS ${PLATFORM_PATH} - DOC "Path to directory containing the Arduino bootloader images and sources.") - - find_file(${PLATFORM}_PROGRAMMERS_PATH - NAMES programmers.txt - PATHS ${PLATFORM_PATH} - DOC "Path to Arduino programmers definition file.") - - find_file(${PLATFORM}_BOARDS_PATH - NAMES boards.txt - PATHS ${PLATFORM_PATH} - DOC "Path to Arduino boards definition file.") - - # some libraries are in platform path in versions 1.5 and greater - if (ARDUINO_SDK_VERSION VERSION_GREATER 1.0.5) - find_file(${PLATFORM}_PLATFORM_LIBRARIES_PATH - NAMES libraries - PATHS ${PLATFORM_PATH} - DOC "Path to platform directory containing the Arduino libraries.") - set(ARDUINO_PLATFORM_LIBRARIES_PATH "${${PLATFORM}_PLATFORM_LIBRARIES_PATH}" PARENT_SCOPE) - else () - set(ARDUINO_PLATFORM_LIBRARIES_PATH "" PARENT_SCOPE) - endif () - - if (${PLATFORM}_BOARDS_PATH) - load_arduino_style_settings(${PLATFORM}_BOARDS "${PLATFORM_PATH}/boards.txt") - endif () - - if (${PLATFORM}_PROGRAMMERS_PATH) - load_arduino_style_settings(${PLATFORM}_PROGRAMMERS "${ARDUINO_PROGRAMMERS_PATH}") - endif () - - if (${PLATFORM}_VARIANTS_PATH) - file(GLOB sub-dir ${${PLATFORM}_VARIANTS_PATH}/*) - foreach (dir ${sub-dir}) - if (IS_DIRECTORY ${dir}) - get_filename_component(variant ${dir} NAME) - set(VARIANTS ${VARIANTS} ${variant} CACHE INTERNAL "A list of registered variant boards") - set(${variant}.path ${dir} CACHE INTERNAL "The path to the variant ${variant}") - endif () - endforeach () - endif () - - if (${PLATFORM}_CORES_PATH) - file(GLOB sub-dir ${${PLATFORM}_CORES_PATH}/*) - foreach (dir ${sub-dir}) - if (IS_DIRECTORY ${dir}) - get_filename_component(core ${dir} NAME) - set(CORES ${CORES} ${core} CACHE INTERNAL "A list of registered cores") - set(${core}.path ${dir} CACHE INTERNAL "The path to the core ${core}") - endif () - endforeach () - endif () - endif () - endif () - -endfunction() - #=============================================================================# # Internal Functions @@ -925,179 +832,6 @@ function(LOAD_GENERATOR_SETTINGS TARGET_NAME PREFIX) endforeach () endfunction() -#=============================================================================# -# load_arduino_style_settings -# [PRIVATE/INTERNAL] -# -# load_arduino_style_settings(SETTINGS_LIST SETTINGS_PATH) -# -# SETTINGS_LIST - Variable name of settings list -# SETTINGS_PATH - File path of settings file to load. -# -# Load a Arduino style 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). -# -#=============================================================================# -function(LOAD_ARDUINO_STYLE_SETTINGS SETTINGS_LIST SETTINGS_PATH) - - 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 () -endfunction() - -#=============================================================================# -# load_arduino_examples -# [PRIVATE/INTERNAL] -# -# load_arduino_examples() -# -# Loads all of Arduino's built-in examples categories, listing it by their names -# without the index prefix ('01.Basics' becomes 'Basics'). -# This list is saved in a cached variable named 'ARDUINO_EXAMPLES_CATEGORIES'. -# -#=============================================================================# -function(load_arduino_examples_categories) - file(GLOB EXAMPLE_CATEGORIES RELATIVE ${ARDUINO_EXAMPLES_PATH} ${ARDUINO_EXAMPLES_PATH}/*) - list(SORT EXAMPLE_CATEGORIES) - foreach (CATEGORY ${EXAMPLE_CATEGORIES}) - if (NOT EXAMPLE_CATEGORY_INDEX_LENGTH) - string(REGEX MATCH "^[0-9]+" CATEGORY_INDEX ${CATEGORY}) - string(LENGTH ${CATEGORY_INDEX} INDEX_LENGTH) - set(EXAMPLE_CATEGORY_INDEX_LENGTH ${INDEX_LENGTH} CACHE INTERNAL - "Number of digits preceeding an example's category path") - endif () - string(REGEX MATCH "[^0-9.]+$" PARSED_CATEGORY ${CATEGORY}) - string(TOLOWER ${PARSED_CATEGORY} PARSED_CATEGORY) - list(APPEND CATEGORIES "${PARSED_CATEGORY}") - endforeach () - set(ARDUINO_EXAMPLES_CATEGORIES ${CATEGORIES} CACHE INTERNAL - "List of the categories of the built-in Arduino examples") -endfunction() - #=============================================================================# # Setup Functions @@ -1715,7 +1449,7 @@ function(SETUP_ARDUINO_EXAMPLE TARGET_NAME EXAMPLE_NAME OUTPUT_VAR) if (CATEGORY_NAME) string(TOLOWER ${CATEGORY_NAME} LOWER_CATEGORY_NAME) - list(FIND ARDUINO_EXAMPLES_CATEGORIES ${LOWER_CATEGORY_NAME} CATEGORY_INDEX) + list(FIND ARDUINO_EXAMPLE_CATEGORIES ${LOWER_CATEGORY_NAME} CATEGORY_INDEX) if (${CATEGORY_INDEX} LESS 0) message(SEND_ERROR "${CATEGORY_NAME} example category doesn't exist, please check your spelling") return() @@ -1848,98 +1582,6 @@ function(SETUP_ARDUINO_SKETCH TARGET_NAME SKETCH_PATH OUTPUT_VAR) endif () endfunction() -#=============================================================================# -# setup_arduino_size_script -# [PRIVATE/INTERNAL] -# -# setup_arduino_size_script(OUTPUT_VAR) -# -# OUTPUT_VAR - Output variable that will contain the script path -# -# Generates script used to display the firmware size. -#=============================================================================# -function(SETUP_ARDUINO_SIZE_SCRIPT OUTPUT_VAR) - set(ARDUINO_SIZE_SCRIPT_PATH ${CMAKE_BINARY_DIR}/CMakeFiles/FirmwareSize.cmake) - - file(WRITE ${ARDUINO_SIZE_SCRIPT_PATH} - "set(AVRSIZE_PROGRAM \"${AVRSIZE_PROGRAM}\") -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) - -#message(\"\${SIZE_OUTPUT_LINES}\") -#message(\"\${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()") - - set(${OUTPUT_VAR} ${ARDUINO_SIZE_SCRIPT_PATH} PARENT_SCOPE) -endfunction() - #=============================================================================# # Find Functions @@ -2504,4 +2146,8 @@ endfunction() #=============================================================================# # Initialization Script #=============================================================================# -include(${CMAKE_CURRENT_LIST_DIR}/Initialization/Initializer.cmake) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/Initialization) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/Extras) + +include(Initializer) diff --git a/cmake/Platform/Extras/CalculateFirmwareSize.cmake b/cmake/Platform/Extras/CalculateFirmwareSize.cmake new file mode 100644 index 0000000..83d124b --- /dev/null +++ b/cmake/Platform/Extras/CalculateFirmwareSize.cmake @@ -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 () \ No newline at end of file diff --git a/cmake/Platform/Initialization/ArduinoSettings.cmake b/cmake/Platform/Initialization/ArduinoSettings.cmake deleted file mode 100644 index e496668..0000000 --- a/cmake/Platform/Initialization/ArduinoSettings.cmake +++ /dev/null @@ -1,16 +0,0 @@ -#=============================================================================# -# Arduino Settings -#=============================================================================# -# setup_arduino_settings -# [PRIVATE/INTERNAL] -# -# setup_arduino_settings() -# -# Setups some basic flags for the arduino upload tools. -#=============================================================================# -function(setup_arduino_settings) - set(ARDUINO_OBJCOPY_EEP_FLAGS -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load - --no-change-warnings --change-section-lma .eeprom=0 CACHE STRING "") - set(ARDUINO_OBJCOPY_HEX_FLAGS -O ihex -R .eeprom CACHE STRING "") - set(ARDUINO_AVRDUDE_FLAGS -V CACHE STRING "") -endfunction() diff --git a/cmake/Platform/Initialization/DefineAdvancedVariables.cmake b/cmake/Platform/Initialization/DefineAdvancedVariables.cmake new file mode 100644 index 0000000..f02c7c8 --- /dev/null +++ b/cmake/Platform/Initialization/DefineAdvancedVariables.cmake @@ -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) diff --git a/cmake/Platform/Initialization/DetectVersion.cmake b/cmake/Platform/Initialization/DetectVersion.cmake new file mode 100644 index 0000000..a7da37b --- /dev/null +++ b/cmake/Platform/Initialization/DetectVersion.cmake @@ -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}") diff --git a/cmake/Platform/Initialization/ProgramFinder.cmake b/cmake/Platform/Initialization/FindPrograms.cmake similarity index 97% rename from cmake/Platform/Initialization/ProgramFinder.cmake rename to cmake/Platform/Initialization/FindPrograms.cmake index 947eadc..8bbe5b2 100644 --- a/cmake/Platform/Initialization/ProgramFinder.cmake +++ b/cmake/Platform/Initialization/FindPrograms.cmake @@ -54,5 +54,5 @@ if (NOT CMAKE_OBJCOPY) endif (NOT CMAKE_OBJCOPY) if (EXISTS "${ARDUINO_EXAMPLES_PATH}") - load_arduino_examples_categories() + include(SetupExampleCategories) endif () diff --git a/cmake/Platform/Initialization/Initializer.cmake b/cmake/Platform/Initialization/Initializer.cmake index f9b398e..b8c866a 100644 --- a/cmake/Platform/Initialization/Initializer.cmake +++ b/cmake/Platform/Initialization/Initializer.cmake @@ -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 () diff --git a/cmake/Platform/Initialization/LoadArduinoPlatformSettings.cmake b/cmake/Platform/Initialization/LoadArduinoPlatformSettings.cmake new file mode 100644 index 0000000..990b81a --- /dev/null +++ b/cmake/Platform/Initialization/LoadArduinoPlatformSettings.cmake @@ -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 () \ No newline at end of file diff --git a/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake b/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake new file mode 100644 index 0000000..0fbbdd2 --- /dev/null +++ b/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake @@ -0,0 +1,96 @@ +#=============================================================================# +# ToDo: Document +#=============================================================================# +set(PLATFORM_PATH ${ARDUINO_SDK_PATH}/hardware/arduino/) +string(REGEX REPLACE "/$" "" PLATFORM_PATH ${PLATFORM_PATH}) +GET_FILENAME_COMPONENT(PLATFORM ${PLATFORM_PATH} NAME) + +# platform path changed in versions 1.5 and greater +if (ARDUINO_SDK_VERSION VERSION_GREATER 1.0.5) + set(PLATFORM_PATH "${PLATFORM_PATH}/avr") +endif () + +if (NOT PLATFORM) + return() +endif () + +# Avoid defining a platform multiple times if it has already been defined before +string(TOUPPER ${PLATFORM} PLATFORM) +list(FIND ARDUINO_PLATFORMS ${PLATFORM} PLATFORM_EXISTS) + +if (PLATFORM_EXISTS GREATER -1) + return() +endif () + +set(${PLATFORM}_PLATFORM_PATH ${PLATFORM_PATH} CACHE INTERNAL "The path to ${PLATFORM}") +set(ARDUINO_PLATFORMS ${ARDUINO_PLATFORMS} ${PLATFORM} CACHE INTERNAL "A list of registered platforms") + +find_file(${PLATFORM}_CORES_PATH + NAMES cores + PATHS ${PLATFORM_PATH} + DOC "Path to directory containing the Arduino core sources.") + +find_file(${PLATFORM}_VARIANTS_PATH + NAMES variants + PATHS ${PLATFORM_PATH} + DOC "Path to directory containing the Arduino variant sources.") + +find_file(${PLATFORM}_BOOTLOADERS_PATH + NAMES bootloaders + PATHS ${PLATFORM_PATH} + DOC "Path to directory containing the Arduino bootloader images and sources.") + +find_file(${PLATFORM}_PROGRAMMERS_PATH + NAMES programmers.txt + PATHS ${PLATFORM_PATH} + DOC "Path to Arduino programmers definition file.") + +find_file(${PLATFORM}_BOARDS_PATH + NAMES boards.txt + PATHS ${PLATFORM_PATH} + DOC "Path to Arduino boards definition file.") + +# some libraries are in platform path in versions 1.5 and greater +if (ARDUINO_SDK_VERSION VERSION_GREATER 1.0.5) + find_file(${PLATFORM}_PLATFORM_LIBRARIES_PATH + NAMES libraries + PATHS ${PLATFORM_PATH} + DOC "Path to platform directory containing the Arduino libraries.") + set(ARDUINO_PLATFORM_LIBRARIES_PATH "${${PLATFORM}_PLATFORM_LIBRARIES_PATH}") +else () + set(ARDUINO_PLATFORM_LIBRARIES_PATH "") +endif () + +if (${PLATFORM}_BOARDS_PATH) + set(SETTINGS_LIST ${PLATFORM}_BOARDS) + set(SETTINGS_PATH "${${PLATFORM}_BOARDS_PATH}") + include(LoadArduinoPlatformSettings) +endif () + +if (${PLATFORM}_PROGRAMMERS_PATH) + set(SETTINGS_LIST ${PLATFORM}_PROGRAMMERS) + set(SETTINGS_PATH "${${PLATFORM}_PROGRAMMERS_PATH}") + include(LoadArduinoPlatformSettings) +endif () + +if (${PLATFORM}_VARIANTS_PATH) + file(GLOB sub-dir ${${PLATFORM}_VARIANTS_PATH}/*) + foreach (dir ${sub-dir}) + if (IS_DIRECTORY ${dir}) + get_filename_component(variant ${dir} NAME) + set(VARIANTS ${VARIANTS} ${variant} CACHE INTERNAL "A list of registered variant boards") + set(${variant}.path ${dir} CACHE INTERNAL "The path to the variant ${variant}") + endif () + endforeach () +endif () + +if (${PLATFORM}_CORES_PATH) + file(GLOB sub-dir ${${PLATFORM}_CORES_PATH}/*) + foreach (dir ${sub-dir}) + if (IS_DIRECTORY ${dir}) + get_filename_component(core ${dir} NAME) + set(CORES ${CORES} ${core} CACHE INTERNAL "A list of registered cores") + set(${core}.path ${dir} CACHE INTERNAL "The path to the core ${core}") + endif () + endforeach () +endif () diff --git a/cmake/Platform/Initialization/SetDefaults.cmake b/cmake/Platform/Initialization/SetDefaults.cmake new file mode 100644 index 0000000..14ee7a1 --- /dev/null +++ b/cmake/Platform/Initialization/SetDefaults.cmake @@ -0,0 +1,4 @@ +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.") diff --git a/cmake/Platform/Initialization/SetupArduinoSettings.cmake b/cmake/Platform/Initialization/SetupArduinoSettings.cmake new file mode 100644 index 0000000..4c48cdd --- /dev/null +++ b/cmake/Platform/Initialization/SetupArduinoSettings.cmake @@ -0,0 +1,9 @@ +#=============================================================================# +# Arduino Settings +#=============================================================================# +# Setups some basic flags for the arduino upload tools. +#=============================================================================# +set(ARDUINO_OBJCOPY_EEP_FLAGS -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load + --no-change-warnings --change-section-lma .eeprom=0 CACHE STRING "") +set(ARDUINO_OBJCOPY_HEX_FLAGS -O ihex -R .eeprom CACHE STRING "") +set(ARDUINO_AVRDUDE_FLAGS -V CACHE STRING "") diff --git a/cmake/Platform/Initialization/CompilerSettings.cmake b/cmake/Platform/Initialization/SetupCompilerSettings.cmake similarity index 95% rename from cmake/Platform/Initialization/CompilerSettings.cmake rename to cmake/Platform/Initialization/SetupCompilerSettings.cmake index 4dbbb9b..5e98ae0 100644 --- a/cmake/Platform/Initialization/CompilerSettings.cmake +++ b/cmake/Platform/Initialization/SetupCompilerSettings.cmake @@ -88,16 +88,9 @@ function(setup_shared_lib_flags) endfunction() #=============================================================================# -# setup_compiler_settings -# [PRIVATE/INTERNAL] -# -# setup_compiler_settings() -# # Setups some basic flags for the gcc/g++ compiler and linker. #=============================================================================# -function(setup_compiler_settings) - setup_c_flags() - setup_cxx_flags() - setup_exe_linker_flags() - setup_shared_lib_flags() -endfunction() +setup_c_flags() +setup_cxx_flags() +setup_exe_linker_flags() +setup_shared_lib_flags() diff --git a/cmake/Platform/Initialization/SetupExampleCategories.cmake b/cmake/Platform/Initialization/SetupExampleCategories.cmake new file mode 100644 index 0000000..44a9a36 --- /dev/null +++ b/cmake/Platform/Initialization/SetupExampleCategories.cmake @@ -0,0 +1,21 @@ +# Setups all of Arduino's built-in examples categories, listing it by their names +# without the index prefix ('01.Basics' becomes 'Basics'). +# This list is saved in a cached variable named 'ARDUINO_EXAMPLE_CATEGORIES'. + +file(GLOB EXAMPLE_CATEGORIES RELATIVE ${ARDUINO_EXAMPLES_PATH} ${ARDUINO_EXAMPLES_PATH}/*) +list(SORT EXAMPLE_CATEGORIES) + +foreach (CATEGORY ${EXAMPLE_CATEGORIES}) + if (NOT EXAMPLE_CATEGORY_INDEX_LENGTH) + string(REGEX MATCH "^[0-9]+" CATEGORY_INDEX ${CATEGORY}) + string(LENGTH ${CATEGORY_INDEX} INDEX_LENGTH) + set(EXAMPLE_CATEGORY_INDEX_LENGTH ${INDEX_LENGTH} CACHE INTERNAL + "Number of digits preceeding an example's category path") + endif () + string(REGEX MATCH "[^0-9.]+$" PARSED_CATEGORY ${CATEGORY}) + string(TOLOWER ${PARSED_CATEGORY} PARSED_CATEGORY) + list(APPEND CATEGORIES "${PARSED_CATEGORY}") +endforeach () + +set(ARDUINO_EXAMPLE_CATEGORIES ${CATEGORIES} CACHE INTERNAL + "List of categories containing the built-in Arduino examples") \ No newline at end of file diff --git a/cmake/Platform/Initialization/SetupFirmwareSizeScript.cmake b/cmake/Platform/Initialization/SetupFirmwareSizeScript.cmake new file mode 100644 index 0000000..e3254d0 --- /dev/null +++ b/cmake/Platform/Initialization/SetupFirmwareSizeScript.cmake @@ -0,0 +1,11 @@ +set(FIRMWARE_SIZE_SCRIPT_PATH "${CMAKE_CURRENT_LIST_DIR}/../Extras/CalculateFirmwareSize.cmake") +file(READ ${FIRMWARE_SIZE_SCRIPT_PATH} FIRMWARE_SIZE_SCRIPT) + +# Replace placeholders with matching arguments +string(REGEX REPLACE "PLACEHOLDER_1" "${AVRSIZE_PROGRAM}" FIRMWARE_SIZE_SCRIPT "${FIRMWARE_SIZE_SCRIPT}") + +# Create the replaced file in the build's cache directory +set(CACHED_FIRMWARE_SCRIPT_PATH ${CMAKE_BINARY_DIR}/CMakeFiles/FirmwareSize.cmake) +file(WRITE ${CACHED_FIRMWARE_SCRIPT_PATH} "${FIRMWARE_SIZE_SCRIPT}") + +set(ARDUINO_SIZE_SCRIPT ${CACHED_FIRMWARE_SCRIPT_PATH} CACHE INTERNAL "Arduino Size Script") diff --git a/cmake/Platform/Initialization/TestSetup.cmake b/cmake/Platform/Initialization/TestSetup.cmake new file mode 100644 index 0000000..09de58c --- /dev/null +++ b/cmake/Platform/Initialization/TestSetup.cmake @@ -0,0 +1,15 @@ +# 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") diff --git a/cmake/Platform/Initialization/VersionDetector.cmake b/cmake/Platform/Initialization/VersionDetector.cmake deleted file mode 100644 index 89de949..0000000 --- a/cmake/Platform/Initialization/VersionDetector.cmake +++ /dev/null @@ -1,41 +0,0 @@ -#=============================================================================# -# detect_arduino_version -# [PRIVATE/INTERNAL] -# -# detect_arduino_version(OUTPUT_VAR_NAME) -# -# OUTPUT_VAR_NAME - Variable name where the detected version will be saved -# -# 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 -# -#=============================================================================# -function(detect_arduino_version OUTPUT_VAR_NAME) - if (ARDUINO_VERSION_PATH) - 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(${OUTPUT_VAR_NAME} "${PARSED_VERSION}" PARENT_SCOPE) - set(${OUTPUT_VAR_NAME}_MAJOR "${SPLIT_VERSION_MAJOR}" PARENT_SCOPE) - set(${OUTPUT_VAR_NAME}_MINOR "${SPLIT_VERSION_MINOR}" PARENT_SCOPE) - set(${OUTPUT_VAR_NAME}_PATCH "${SPLIT_VERSION_PATCH}" PARENT_SCOPE) - endif () - endif () -endfunction() \ No newline at end of file