From d93e9e3bba2f4c53b60c55cc6d8a03e4082d5a91 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Mon, 9 Oct 2017 01:14:29 +0300 Subject: [PATCH 1/8] Took a more script-driven approach to the initialization process. Instead of calling functions located in dedicated files, those files became script parts themselves, allowing to simply include them in the script using CMake's 'include' command. Also extracted the 'register_hardware_platform' function to a script named 'RegisterHardwarePlatform.cmake', which sets the platform path explicitly, causing less modular code yet simpler in that there's no other use of this function through the entire project. --- cmake/Platform/Arduino.cmake | 93 ------------------- .../Initialization/DetectVersion.cmake | 40 ++++++++ ...ProgramFinder.cmake => FindPrograms.cmake} | 0 .../Platform/Initialization/Initializer.cmake | 22 +---- .../RegisterHardwarePlatform.cmake | 92 ++++++++++++++++++ .../Initialization/VersionDetector.cmake | 41 -------- 6 files changed, 135 insertions(+), 153 deletions(-) create mode 100644 cmake/Platform/Initialization/DetectVersion.cmake rename cmake/Platform/Initialization/{ProgramFinder.cmake => FindPrograms.cmake} (100%) create mode 100644 cmake/Platform/Initialization/RegisterHardwarePlatform.cmake delete mode 100644 cmake/Platform/Initialization/VersionDetector.cmake diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index 47e7c25..44e4e49 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 diff --git a/cmake/Platform/Initialization/DetectVersion.cmake b/cmake/Platform/Initialization/DetectVersion.cmake new file mode 100644 index 0000000..31df1ee --- /dev/null +++ b/cmake/Platform/Initialization/DetectVersion.cmake @@ -0,0 +1,40 @@ +#=============================================================================# +# 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 +# +#=============================================================================# +if (NOT ARDUINO_VERSION_PATH) + 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 100% rename from cmake/Platform/Initialization/ProgramFinder.cmake rename to cmake/Platform/Initialization/FindPrograms.cmake diff --git a/cmake/Platform/Initialization/Initializer.cmake b/cmake/Platform/Initialization/Initializer.cmake index f9b398e..427a02a 100644 --- a/cmake/Platform/Initialization/Initializer.cmake +++ b/cmake/Platform/Initialization/Initializer.cmake @@ -1,6 +1,5 @@ include(${CMAKE_CURRENT_LIST_DIR}/CompilerSettings.cmake) include(${CMAKE_CURRENT_LIST_DIR}/ArduinoSettings.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/VersionDetector.cmake) #=============================================================================# # Initialization @@ -16,21 +15,9 @@ if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) DOC "Path to Arduino version file.") # 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(${CMAKE_CURRENT_LIST_DIR}/ProgramFinder.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/DetectVersion.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/RegisterHardwarePlatform.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/FindPrograms.cmake) 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.") @@ -56,9 +43,6 @@ if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) 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() - set(ARDUINO_FOUND True CACHE INTERNAL "Arduino Found") mark_as_advanced( ARDUINO_CORES_PATH diff --git a/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake b/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake new file mode 100644 index 0000000..aed246a --- /dev/null +++ b/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake @@ -0,0 +1,92 @@ +#=============================================================================# +# 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) + 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 () 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 From 0cd527bfa0e45bf342fc657fadce3b3a5f495114 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Mon, 9 Oct 2017 01:24:40 +0300 Subject: [PATCH 2/8] Completed the initialization script. Further extracted the script to separate files, leading to a super-small initialization script - just as a clean, modular system should be. --- .../DefineAdvancedVariables.cmake | 14 +++++++ .../Platform/Initialization/Initializer.cmake | 39 ++----------------- .../Platform/Initialization/SetDefaults.cmake | 4 ++ cmake/Platform/Initialization/TestSetup.cmake | 15 +++++++ 4 files changed, 37 insertions(+), 35 deletions(-) create mode 100644 cmake/Platform/Initialization/DefineAdvancedVariables.cmake create mode 100644 cmake/Platform/Initialization/SetDefaults.cmake create mode 100644 cmake/Platform/Initialization/TestSetup.cmake 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/Initializer.cmake b/cmake/Platform/Initialization/Initializer.cmake index 427a02a..210f7b4 100644 --- a/cmake/Platform/Initialization/Initializer.cmake +++ b/cmake/Platform/Initialization/Initializer.cmake @@ -8,7 +8,6 @@ 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} @@ -18,44 +17,14 @@ if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) include(${CMAKE_CURRENT_LIST_DIR}/DetectVersion.cmake) include(${CMAKE_CURRENT_LIST_DIR}/RegisterHardwarePlatform.cmake) include(${CMAKE_CURRENT_LIST_DIR}/FindPrograms.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/SetDefaults.cmake) - 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") + include(${CMAKE_CURRENT_LIST_DIR}/TestSetup.cmake) setup_arduino_size_script(ARDUINO_SIZE_SCRIPT) set(ARDUINO_SIZE_SCRIPT ${ARDUINO_SIZE_SCRIPT} CACHE INTERNAL "Arduino Size Script") 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) + + include(${CMAKE_CURRENT_LIST_DIR}/DefineAdvancedVariables.cmake) 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/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") From 6aa4a78deb27a2dcdc41f0c7e0bbb5aaed4edae2 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Mon, 9 Oct 2017 10:34:24 +0300 Subject: [PATCH 3/8] Added 'Initialization' directory to modules path. It made the '${CMAKE_CURRENT_LIST_DIR}' prefix unnecessary in various 'include' commands. Note that their '.cmake' suffixes has also been removed. --- cmake/Platform/Arduino.cmake | 5 ++++- .../Platform/Initialization/Initializer.cmake | 19 ++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index 44e4e49..a55cb93 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -2411,4 +2411,7 @@ 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) + +include(Initializer) diff --git a/cmake/Platform/Initialization/Initializer.cmake b/cmake/Platform/Initialization/Initializer.cmake index 210f7b4..a7d4afd 100644 --- a/cmake/Platform/Initialization/Initializer.cmake +++ b/cmake/Platform/Initialization/Initializer.cmake @@ -1,9 +1,10 @@ -include(${CMAKE_CURRENT_LIST_DIR}/CompilerSettings.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/ArduinoSettings.cmake) - #=============================================================================# # Initialization #=============================================================================# + +include(CompilerSettings) +include(ArduinoSettings) + setup_compiler_settings() setup_arduino_settings() @@ -14,17 +15,17 @@ if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) DOC "Path to Arduino version file.") # get version first (some stuff depends on versions) - include(${CMAKE_CURRENT_LIST_DIR}/DetectVersion.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/RegisterHardwarePlatform.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/FindPrograms.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/SetDefaults.cmake) + include(DetectVersion) + include(RegisterHardwarePlatform) + include(FindPrograms) + include(SetDefaults) - include(${CMAKE_CURRENT_LIST_DIR}/TestSetup.cmake) + include(TestSetup) setup_arduino_size_script(ARDUINO_SIZE_SCRIPT) set(ARDUINO_SIZE_SCRIPT ${ARDUINO_SIZE_SCRIPT} CACHE INTERNAL "Arduino Size Script") set(ARDUINO_FOUND True CACHE INTERNAL "Arduino Found") - include(${CMAKE_CURRENT_LIST_DIR}/DefineAdvancedVariables.cmake) + include(DefineAdvancedVariables) endif () From 1c7d59e895780aa6a75f9b62171a09b7776f3313 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Fri, 13 Oct 2017 01:00:35 +0300 Subject: [PATCH 4/8] Extracted 'SETUP_FIRMWARE_SIZE_SCRIPT' function into a readable script. Until now the function wrote an entire CMake script as a hardcoded string to a cached file, in order to calculate a target's firmware size. This commit changes it by extracting the hardcoded string into a valid, readable and easily editable CMake script, named 'CalculateFirmwareSize.cmake', located under the 'Extras' directory. Added another initializing script to completely replace the need for the function, including a script part instead, named 'SetupFirmwareSizeScript.cmake'. --- cmake/Platform/Arduino.cmake | 93 +------------------ .../Extras/CalculateFirmwareSize.cmake | 71 ++++++++++++++ .../Platform/Initialization/Initializer.cmake | 6 +- .../SetupFirmwareSizeScript.cmake | 11 +++ 4 files changed, 85 insertions(+), 96 deletions(-) create mode 100644 cmake/Platform/Extras/CalculateFirmwareSize.cmake create mode 100644 cmake/Platform/Initialization/SetupFirmwareSizeScript.cmake diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index a55cb93..debb55a 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -1755,98 +1755,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 @@ -2413,5 +2321,6 @@ endfunction() #=============================================================================# 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/Initializer.cmake b/cmake/Platform/Initialization/Initializer.cmake index a7d4afd..26ff2b9 100644 --- a/cmake/Platform/Initialization/Initializer.cmake +++ b/cmake/Platform/Initialization/Initializer.cmake @@ -19,13 +19,11 @@ if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) include(RegisterHardwarePlatform) include(FindPrograms) include(SetDefaults) + include(SetupFirmwareSizeScript) include(TestSetup) - - setup_arduino_size_script(ARDUINO_SIZE_SCRIPT) - set(ARDUINO_SIZE_SCRIPT ${ARDUINO_SIZE_SCRIPT} CACHE INTERNAL "Arduino Size Script") + include(DefineAdvancedVariables) set(ARDUINO_FOUND True CACHE INTERNAL "Arduino Found") - include(DefineAdvancedVariables) endif () 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") From 315fddc32ceb10a07f3eadc47c4bf61dd47e9f5f Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Fri, 13 Oct 2017 11:59:23 +0300 Subject: [PATCH 5/8] Refactored Arduino and Compiler settings setup to scripts instead of functions. It sticks with the script-driven approach, providing consistency. --- .../Initialization/ArduinoSettings.cmake | 16 ---------------- cmake/Platform/Initialization/Initializer.cmake | 8 +++----- .../Initialization/SetupArduinoSettings.cmake | 9 +++++++++ ...ettings.cmake => SetupCompilerSettings.cmake} | 15 ++++----------- 4 files changed, 16 insertions(+), 32 deletions(-) delete mode 100644 cmake/Platform/Initialization/ArduinoSettings.cmake create mode 100644 cmake/Platform/Initialization/SetupArduinoSettings.cmake rename cmake/Platform/Initialization/{CompilerSettings.cmake => SetupCompilerSettings.cmake} (95%) 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/Initializer.cmake b/cmake/Platform/Initialization/Initializer.cmake index 26ff2b9..206861c 100644 --- a/cmake/Platform/Initialization/Initializer.cmake +++ b/cmake/Platform/Initialization/Initializer.cmake @@ -2,13 +2,11 @@ # Initialization #=============================================================================# -include(CompilerSettings) -include(ArduinoSettings) +if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) -setup_compiler_settings() -setup_arduino_settings() + include(SetupCompilerSettings) + include(SetupArduinoSettings) -if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) find_file(ARDUINO_VERSION_PATH NAMES lib/version.txt PATHS ${ARDUINO_SDK_PATH} 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() From da262c2578b68c8e61bd9277989ed297fa138185 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Fri, 13 Oct 2017 12:05:16 +0300 Subject: [PATCH 6/8] Completely cleaned 'Initializer' script from unnecessary code. Moved the 'find_file' command used to find SDK's version file to the 'DetectVersion' script. This results in an 'Initializer' script that only includes other script parts. --- cmake/Platform/Initialization/DetectVersion.cmake | 6 ++++++ cmake/Platform/Initialization/Initializer.cmake | 6 +----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cmake/Platform/Initialization/DetectVersion.cmake b/cmake/Platform/Initialization/DetectVersion.cmake index 31df1ee..a7da37b 100644 --- a/cmake/Platform/Initialization/DetectVersion.cmake +++ b/cmake/Platform/Initialization/DetectVersion.cmake @@ -8,7 +8,13 @@ # ${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 () diff --git a/cmake/Platform/Initialization/Initializer.cmake b/cmake/Platform/Initialization/Initializer.cmake index 206861c..b8c866a 100644 --- a/cmake/Platform/Initialization/Initializer.cmake +++ b/cmake/Platform/Initialization/Initializer.cmake @@ -7,13 +7,9 @@ if (NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH) include(SetupCompilerSettings) include(SetupArduinoSettings) - find_file(ARDUINO_VERSION_PATH - NAMES lib/version.txt - PATHS ${ARDUINO_SDK_PATH} - DOC "Path to Arduino version file.") - # get version first (some stuff depends on versions) include(DetectVersion) + include(RegisterHardwarePlatform) include(FindPrograms) include(SetDefaults) From 7170137e1f206a9cc1c319975a630fbd61825edb Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Fri, 13 Oct 2017 16:08:23 +0300 Subject: [PATCH 7/8] Extracted 'load_arduino_style_settings' function into a script. This is the last part that still was in the 'Arduino' script, now extracted to a script named 'LoadArduinoPlatformSettings' under the 'Initialization' directory. --- cmake/Platform/Arduino.cmake | 144 ------------------ .../LoadArduinoPlatformSettings.cmake | 134 ++++++++++++++++ .../RegisterHardwarePlatform.cmake | 8 +- 3 files changed, 140 insertions(+), 146 deletions(-) create mode 100644 cmake/Platform/Initialization/LoadArduinoPlatformSettings.cmake diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index debb55a..cfcacd6 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -832,150 +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] 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 index aed246a..0fbbdd2 100644 --- a/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake +++ b/cmake/Platform/Initialization/RegisterHardwarePlatform.cmake @@ -62,11 +62,15 @@ else () endif () if (${PLATFORM}_BOARDS_PATH) - load_arduino_style_settings(${PLATFORM}_BOARDS "${PLATFORM_PATH}/boards.txt") + set(SETTINGS_LIST ${PLATFORM}_BOARDS) + set(SETTINGS_PATH "${${PLATFORM}_BOARDS_PATH}") + include(LoadArduinoPlatformSettings) endif () if (${PLATFORM}_PROGRAMMERS_PATH) - load_arduino_style_settings(${PLATFORM}_PROGRAMMERS "${ARDUINO_PROGRAMMERS_PATH}") + set(SETTINGS_LIST ${PLATFORM}_PROGRAMMERS) + set(SETTINGS_PATH "${${PLATFORM}_PROGRAMMERS_PATH}") + include(LoadArduinoPlatformSettings) endif () if (${PLATFORM}_VARIANTS_PATH) From cf64a33e95924194c067c4ab0297cb5e33ce635e Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Fri, 20 Oct 2017 14:07:45 +0300 Subject: [PATCH 8/8] Extracted 'load_arduino_examples_categories' function into a script. The script is named 'SetupExampleCategories', located under the 'Initialization' directory. Also renamed the cached variable 'ARDUINO_EXAMPLES_CATEGORIES' to 'ARDUINO_EXAMPLE_CATEGORIES'. --- cmake/Platform/Arduino.cmake | 31 +------------------ .../Initialization/FindPrograms.cmake | 2 +- .../SetupExampleCategories.cmake | 21 +++++++++++++ 3 files changed, 23 insertions(+), 31 deletions(-) create mode 100644 cmake/Platform/Initialization/SetupExampleCategories.cmake diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index cfcacd6..de9ea5f 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -832,35 +832,6 @@ function(LOAD_GENERATOR_SETTINGS TARGET_NAME PREFIX) endforeach () 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 @@ -1478,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() diff --git a/cmake/Platform/Initialization/FindPrograms.cmake b/cmake/Platform/Initialization/FindPrograms.cmake index 947eadc..8bbe5b2 100644 --- a/cmake/Platform/Initialization/FindPrograms.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/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