aboutsummaryrefslogtreecommitdiff
path: root/utils/cmake
diff options
context:
space:
mode:
authorJakob Stendahl <jakobste@uio.no>2021-01-11 13:41:18 +0100
committerJakob Stendahl <jakobste@uio.no>2021-01-11 13:41:18 +0100
commitd17bc0fc4bb057378fadf3f9feb0de1df60d611a (patch)
treeca3069eeacb0b7379cb289d87be932956e449d9c /utils/cmake
parent19d65c7b2e287223113ab916e103638c5c5003f5 (diff)
downloadhoverbit-ble-d17bc0fc4bb057378fadf3f9feb0de1df60d611a.tar.gz
hoverbit-ble-d17bc0fc4bb057378fadf3f9feb0de1df60d611a.zip
:sparkles: Add working bluetooth receiver
Diffstat (limited to 'utils/cmake')
-rw-r--r--utils/cmake/JSONParser.cmake309
-rw-r--r--utils/cmake/buildtools/codal.cmake85
-rw-r--r--utils/cmake/buildtools/yotta.cmake23
-rw-r--r--utils/cmake/colours.cmake19
-rw-r--r--utils/cmake/toolchains/ARM_GCC/bin-generator.cmake9
-rw-r--r--utils/cmake/toolchains/ARM_GCC/compiler-flags.cmake49
-rw-r--r--utils/cmake/toolchains/ARM_GCC/hex-generator.cmake9
-rw-r--r--utils/cmake/toolchains/ARM_GCC/platform_includes.h10
-rw-r--r--utils/cmake/toolchains/ARM_GCC/toolchain.cmake26
-rw-r--r--utils/cmake/toolchains/AVR_GCC/bin-generator.cmake9
-rw-r--r--utils/cmake/toolchains/AVR_GCC/compiler-flags.cmake43
-rw-r--r--utils/cmake/toolchains/AVR_GCC/hex-generator.cmake9
-rw-r--r--utils/cmake/toolchains/AVR_GCC/platform_includes.h14
-rw-r--r--utils/cmake/toolchains/AVR_GCC/toolchain.cmake29
-rw-r--r--utils/cmake/toolchains/XTENSA_GCC/bin-generator.cmake9
-rw-r--r--utils/cmake/toolchains/XTENSA_GCC/compiler-flags.cmake43
-rw-r--r--utils/cmake/toolchains/XTENSA_GCC/hex-generator.cmake9
-rw-r--r--utils/cmake/toolchains/XTENSA_GCC/platform_includes.h10
-rw-r--r--utils/cmake/toolchains/XTENSA_GCC/toolchain.cmake26
-rw-r--r--utils/cmake/util.cmake156
20 files changed, 896 insertions, 0 deletions
diff --git a/utils/cmake/JSONParser.cmake b/utils/cmake/JSONParser.cmake
new file mode 100644
index 0000000..7f45f14
--- /dev/null
+++ b/utils/cmake/JSONParser.cmake
@@ -0,0 +1,309 @@
+# The MIT License (MIT)
+
+# Copyright (c) 2015 Stefan Bellus
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+cmake_minimum_required(VERSION 3.1)
+
+if (DEFINED JSonParserGuard)
+ return()
+endif()
+
+set(JSonParserGuard yes)
+
+macro(sbeParseJson prefix jsonString)
+ cmake_policy(PUSH)
+
+ set(json_string "${${jsonString}}")
+ string(LENGTH "${json_string}" json_jsonLen)
+ set(json_index 0)
+ set(json_AllVariables ${prefix})
+ set(json_ArrayNestingLevel 0)
+ set(json_MaxArrayNestingLevel 0)
+
+ _sbeParse(${prefix})
+
+ unset(json_index)
+ unset(json_AllVariables)
+ unset(json_jsonLen)
+ unset(json_string)
+ unset(json_value)
+ unset(json_inValue)
+ unset(json_name)
+ unset(json_inName)
+ unset(json_newPrefix)
+ unset(json_reservedWord)
+ unset(json_arrayIndex)
+ unset(json_char)
+ unset(json_end)
+ unset(json_ArrayNestingLevel)
+ foreach(json_nestingLevel RANGE ${json_MaxArrayNestingLevel})
+ unset(json_${json_nestingLevel}_arrayIndex)
+ endforeach()
+ unset(json_nestingLevel)
+ unset(json_MaxArrayNestingLevel)
+
+ cmake_policy(POP)
+endmacro()
+
+macro(sbeClearJson prefix)
+ foreach(json_var ${${prefix}})
+ unset(${json_var})
+ endforeach()
+
+ unset(${prefix})
+ unset(json_var)
+endmacro()
+
+macro(sbePrintJson prefix)
+ foreach(json_var ${${prefix}})
+ message("${json_var} = ${${json_var}}")
+ endforeach()
+endmacro()
+
+macro(_sbeParse prefix)
+
+ while(${json_index} LESS ${json_jsonLen})
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+
+ if("\"" STREQUAL "${json_char}")
+ _sbeParseNameValue(${prefix})
+ elseif("{" STREQUAL "${json_char}")
+ _sbeMoveToNextNonEmptyCharacter()
+ _sbeParseObject(${prefix})
+ elseif("[" STREQUAL "${json_char}")
+ _sbeMoveToNextNonEmptyCharacter()
+ _sbeParseArray(${prefix})
+ endif()
+
+ if(${json_index} LESS ${json_jsonLen})
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+ else()
+ break()
+ endif()
+
+ if ("}" STREQUAL "${json_char}" OR "]" STREQUAL "${json_char}")
+ break()
+ endif()
+
+ _sbeMoveToNextNonEmptyCharacter()
+ endwhile()
+endmacro()
+
+macro(_sbeParseNameValue prefix)
+ set(json_name "")
+ set(json_inName no)
+
+ while(${json_index} LESS ${json_jsonLen})
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+
+ # check if name ends
+ if("\"" STREQUAL "${json_char}" AND json_inName)
+ set(json_inName no)
+ _sbeMoveToNextNonEmptyCharacter()
+ if(NOT ${json_index} LESS ${json_jsonLen})
+ break()
+ endif()
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+ set(json_newPrefix ${prefix}.${json_name})
+ set(json_name "")
+
+ if(":" STREQUAL "${json_char}")
+ _sbeMoveToNextNonEmptyCharacter()
+ if(NOT ${json_index} LESS ${json_jsonLen})
+ break()
+ endif()
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+
+ if("\"" STREQUAL "${json_char}")
+ _sbeParseValue(${json_newPrefix})
+ break()
+ elseif("{" STREQUAL "${json_char}")
+ _sbeMoveToNextNonEmptyCharacter()
+ _sbeParseObject(${json_newPrefix})
+ break()
+ elseif("[" STREQUAL "${json_char}")
+ _sbeMoveToNextNonEmptyCharacter()
+ _sbeParseArray(${json_newPrefix})
+ break()
+ else()
+ # reserved word starts
+ _sbeParseReservedWord(${json_newPrefix})
+ break()
+ endif()
+ else()
+ # name without value
+ list(APPEND ${json_AllVariables} ${json_newPrefix})
+ set(${json_newPrefix} "")
+ break()
+ endif()
+ endif()
+
+ if(json_inName)
+ # remove escapes
+ if("\\" STREQUAL "${json_char}")
+ math(EXPR json_index "${json_index} + 1")
+ if(NOT ${json_index} LESS ${json_jsonLen})
+ break()
+ endif()
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+ endif()
+
+ set(json_name "${json_name}${json_char}")
+ endif()
+
+ # check if name starts
+ if("\"" STREQUAL "${json_char}" AND NOT json_inName)
+ set(json_inName yes)
+ endif()
+
+ _sbeMoveToNextNonEmptyCharacter()
+ endwhile()
+endmacro()
+
+macro(_sbeParseReservedWord prefix)
+ set(json_reservedWord "")
+ set(json_end no)
+ while(${json_index} LESS ${json_jsonLen} AND NOT json_end)
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+
+ if("," STREQUAL "${json_char}" OR "}" STREQUAL "${json_char}" OR "]" STREQUAL "${json_char}")
+ set(json_end yes)
+ else()
+ set(json_reservedWord "${json_reservedWord}${json_char}")
+ math(EXPR json_index "${json_index} + 1")
+ endif()
+ endwhile()
+
+ list(APPEND ${json_AllVariables} ${prefix})
+ string(STRIP "${json_reservedWord}" json_reservedWord)
+ set(${prefix} ${json_reservedWord})
+endmacro()
+
+macro(_sbeParseValue prefix)
+ cmake_policy(SET CMP0054 NEW) # turn off implicit expansions in if statement
+
+ set(json_value "")
+ set(json_inValue no)
+
+ while(${json_index} LESS ${json_jsonLen})
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+
+ # check if json_value ends, it is ended by "
+ if("\"" STREQUAL "${json_char}" AND json_inValue)
+ set(json_inValue no)
+
+ set(${prefix} ${json_value})
+ list(APPEND ${json_AllVariables} ${prefix})
+ _sbeMoveToNextNonEmptyCharacter()
+ break()
+ endif()
+
+ if(json_inValue)
+ # if " is escaped consume
+ if("\\" STREQUAL "${json_char}")
+ math(EXPR json_index "${json_index} + 1")
+ if(NOT ${json_index} LESS ${json_jsonLen})
+ break()
+ endif()
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+ if(NOT "\"" STREQUAL "${json_char}")
+ # if it is not " then copy also escape character
+ set(json_char "\\${json_char}")
+ endif()
+ endif()
+
+ _sbeAddEscapedCharacter("${json_char}")
+ endif()
+
+ # check if value starts
+ if("\"" STREQUAL "${json_char}" AND NOT json_inValue)
+ set(json_inValue yes)
+ endif()
+
+ math(EXPR json_index "${json_index} + 1")
+ endwhile()
+endmacro()
+
+macro(_sbeAddEscapedCharacter char)
+ string(CONCAT json_value "${json_value}" "${char}")
+endmacro()
+
+macro(_sbeParseObject prefix)
+ _sbeParse(${prefix})
+ _sbeMoveToNextNonEmptyCharacter()
+endmacro()
+
+macro(_sbeParseArray prefix)
+ math(EXPR json_ArrayNestingLevel "${json_ArrayNestingLevel} + 1")
+ set(json_${json_ArrayNestingLevel}_arrayIndex 0)
+
+ set(${prefix} "")
+ list(APPEND ${json_AllVariables} ${prefix})
+
+ while(${json_index} LESS ${json_jsonLen})
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+
+ if("\"" STREQUAL "${json_char}")
+ # simple value
+ list(APPEND ${prefix} ${json_${json_ArrayNestingLevel}_arrayIndex})
+ _sbeParseValue(${prefix}_${json_${json_ArrayNestingLevel}_arrayIndex})
+ elseif("{" STREQUAL "${json_char}")
+ # object
+ _sbeMoveToNextNonEmptyCharacter()
+ list(APPEND ${prefix} ${json_${json_ArrayNestingLevel}_arrayIndex})
+ _sbeParseObject(${prefix}_${json_${json_ArrayNestingLevel}_arrayIndex})
+ else()
+ list(APPEND ${prefix} ${json_${json_ArrayNestingLevel}_arrayIndex})
+ _sbeParseReservedWord(${prefix}_${json_${json_ArrayNestingLevel}_arrayIndex})
+ endif()
+
+ if(NOT ${json_index} LESS ${json_jsonLen})
+ break()
+ endif()
+
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+
+ if("]" STREQUAL "${json_char}")
+ _sbeMoveToNextNonEmptyCharacter()
+ break()
+ elseif("," STREQUAL "${json_char}")
+ math(EXPR json_${json_ArrayNestingLevel}_arrayIndex "${json_${json_ArrayNestingLevel}_arrayIndex} + 1")
+ endif()
+
+ _sbeMoveToNextNonEmptyCharacter()
+ endwhile()
+
+ if(${json_MaxArrayNestingLevel} LESS ${json_ArrayNestingLevel})
+ set(json_MaxArrayNestingLevel ${json_ArrayNestingLevel})
+ endif()
+ math(EXPR json_ArrayNestingLevel "${json_ArrayNestingLevel} - 1")
+endmacro()
+
+macro(_sbeMoveToNextNonEmptyCharacter)
+ math(EXPR json_index "${json_index} + 1")
+ if(${json_index} LESS ${json_jsonLen})
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+ while(${json_char} MATCHES "[ \t\n\r]" AND ${json_index} LESS ${json_jsonLen})
+ math(EXPR json_index "${json_index} + 1")
+ string(SUBSTRING "${json_string}" ${json_index} 1 json_char)
+ endwhile()
+ endif()
+endmacro()
diff --git a/utils/cmake/buildtools/codal.cmake b/utils/cmake/buildtools/codal.cmake
new file mode 100644
index 0000000..ea8b23c
--- /dev/null
+++ b/utils/cmake/buildtools/codal.cmake
@@ -0,0 +1,85 @@
+add_executable(
+ ${device.device}
+ ${SOURCE_FILES}
+)
+
+if("${INCLUDE_DIRS}" STRGREATER "")
+ target_include_directories(${device.device} PUBLIC "${INCLUDE_DIRS}")
+endif()
+
+set_target_properties(${device.device} PROPERTIES SUFFIX "" ENABLE_EXPORTS ON)
+
+# link the executable with supporting libraries.
+target_link_libraries(
+ ${device.device}
+ ${CODAL_DEPS}
+)
+
+# import toolchain bin generation command
+if(${device.generate_bin})
+ include(${TOOLCHAIN_FOLDER}/bin-generator.cmake)
+endif()
+
+# import toolchain hex generation command
+if(${device.generate_hex})
+ include(${TOOLCHAIN_FOLDER}/hex-generator.cmake)
+endif()
+
+# post process command hook, depends on the hex file generated by the build system.
+if("${device.post_process.command}" STRGREATER "" OR "${device.post_process}" STRGREATER "")
+
+ if("${device.post_process}" STRGREATER "")
+ set(POST_PROCESS_COMMAND ${device.post_process})
+ else()
+ set(POST_PROCESS_COMMAND ${device.post_process.command})
+ endif()
+
+ set(POST_PROCESS_DEPENDS "${device.post_process.depends}")
+
+ # replace specific strings in the command, this gives users flexibility, they don't have to manually specify the location of files
+ string(REPLACE "<OUTPUT_HEX_LOCATION>" ${PROJECT_SOURCE_DIR}/${CODAL_APP_OUTPUT_DIR}/${device.device}.hex CODAL_POSTPROCESS_COMMAND ${POST_PROCESS_COMMAND})
+ string(REPLACE "<OUTPUT_HEX_DESTINATION>" ${PROJECT_SOURCE_DIR}/${CODAL_APP_OUTPUT_DIR} CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+ string(REPLACE "<OUTPUT_HEX_NAME>" ${device.device} CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+
+ string(REPLACE "<OUTPUT_BIN_LOCATION>" ${PROJECT_SOURCE_DIR}/${CODAL_APP_OUTPUT_DIR}/${device.device}.bin CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+ string(REPLACE "<OUTPUT_BIN_DESTINATION>" ${PROJECT_SOURCE_DIR}/${CODAL_APP_OUTPUT_DIR} CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+ string(REPLACE "<OUTPUT_BIN_NAME>" ${device.device}.bin CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+
+ string(REPLACE "<OUTPUT_ELF_LOCATION>" ${PROJECT_SOURCE_DIR}/build/${device.device} CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+ string(REPLACE "<OUTPUT_ELF_DESTINATION>" ${PROJECT_SOURCE_DIR}/${CODAL_APP_OUTPUT_DIR} CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+ string(REPLACE "<OUTPUT_ELF_NAME>" ${device.device} CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+
+ string(REPLACE "<CODAL_APP_OUTPUT_DIR>" ${PROJECT_SOURCE_DIR}/${CODAL_APP_OUTPUT_DIR} CODAL_POSTPROCESS_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+
+ #convert to a command
+ separate_arguments(FINAL_COMMAND UNIX_COMMAND ${CODAL_POSTPROCESS_COMMAND})
+
+ # execute
+ if(POST_PROCESS_DEPENDS STREQUAL "ELF")
+ add_custom_command(
+ TARGET ${device.device}
+ COMMAND ${FINAL_COMMAND}
+ DEPENDS ${device.device}
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+ COMMENT "Executing post process command"
+ )
+ elseif(POST_PROCESS_DEPENDS STREQUAL "HEX")
+ add_custom_command(
+ TARGET ${device.device}_hex
+ COMMAND ${FINAL_COMMAND}
+ DEPENDS ${device.device}
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+ COMMENT "Executing post process command"
+ )
+ else()
+ #by default post process should depend on hex
+ add_custom_command(
+ TARGET ${device.device}_bin
+ COMMAND ${FINAL_COMMAND}
+ DEPENDS ${device.device}
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+ COMMENT "Executing post process command"
+ )
+ endif()
+
+endif() \ No newline at end of file
diff --git a/utils/cmake/buildtools/yotta.cmake b/utils/cmake/buildtools/yotta.cmake
new file mode 100644
index 0000000..8002006
--- /dev/null
+++ b/utils/cmake/buildtools/yotta.cmake
@@ -0,0 +1,23 @@
+if("${INCLUDE_DIRS}" STRGREATER "")
+ target_include_directories(codal PUBLIC "${INCLUDE_DIRS}")
+endif()
+
+add_library(codal "${SOURCE_FILES}")
+set_target_properties(codal PROPERTIES SUFFIX "" ENABLE_EXPORTS ON)
+
+target_compile_definitions(codal PUBLIC "${device.definitions}")
+target_include_directories(codal PUBLIC ${PLATFORM_INCLUDES_PATH})
+target_compile_options(codal PUBLIC -include ${EXTRA_INCLUDES_PATH})
+
+set(STRIPPED "")
+string(STRIP "${CMAKE_LINKER_FLAGS}" STRIPPED)
+# link the executable with supporting libraries.
+target_link_libraries(codal "${CODAL_DEPS};${STRIPPED}")
+
+#
+# Supress the addition of implicit linker flags (such as -rdynamic)
+#
+set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
+set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
+set(CMAKE_EXE_EXPORTS_C_FLAG "")
+set(CMAKE_EXE_EXPORTS_CXX_FLAG "") \ No newline at end of file
diff --git a/utils/cmake/colours.cmake b/utils/cmake/colours.cmake
new file mode 100644
index 0000000..2786b49
--- /dev/null
+++ b/utils/cmake/colours.cmake
@@ -0,0 +1,19 @@
+if(NOT WIN32)
+ string(ASCII 27 Esc)
+ set(ColourReset "${Esc}[m")
+ set(ColourBold "${Esc}[1m")
+ set(Red "${Esc}[31m")
+ set(Green "${Esc}[32m")
+ set(Yellow "${Esc}[33m")
+ set(Blue "${Esc}[34m")
+ set(Magenta "${Esc}[35m")
+ set(Cyan "${Esc}[36m")
+ set(White "${Esc}[37m")
+ set(BoldRed "${Esc}[1;31m")
+ set(BoldGreen "${Esc}[1;32m")
+ set(BoldYellow "${Esc}[1;33m")
+ set(BoldBlue "${Esc}[1;34m")
+ set(BoldMagenta "${Esc}[1;35m")
+ set(BoldCyan "${Esc}[1;36m")
+ set(BoldWhite "${Esc}[1;37m")
+endif()
diff --git a/utils/cmake/toolchains/ARM_GCC/bin-generator.cmake b/utils/cmake/toolchains/ARM_GCC/bin-generator.cmake
new file mode 100644
index 0000000..d18d098
--- /dev/null
+++ b/utils/cmake/toolchains/ARM_GCC/bin-generator.cmake
@@ -0,0 +1,9 @@
+add_custom_command(
+ OUTPUT "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin"
+ COMMAND "${ARM_NONE_EABI_OBJCOPY}" -O binary "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${device.device}" "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin"
+ DEPENDS ${device.device}
+ COMMENT "converting to bin file."
+)
+
+#specify a dependency on the elf file so that bin is automatically rebuilt when elf is changed.
+add_custom_target(${device.device}_bin ALL DEPENDS "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin")
diff --git a/utils/cmake/toolchains/ARM_GCC/compiler-flags.cmake b/utils/cmake/toolchains/ARM_GCC/compiler-flags.cmake
new file mode 100644
index 0000000..16aacaa
--- /dev/null
+++ b/utils/cmake/toolchains/ARM_GCC/compiler-flags.cmake
@@ -0,0 +1,49 @@
+set(EXPLICIT_INCLUDES "")
+if((CMAKE_VERSION VERSION_GREATER "3.4.0") OR (CMAKE_VERSION VERSION_EQUAL "3.4.0"))
+ # from CMake 3.4 <INCLUDES> are separate to <FLAGS> in the
+ # CMAKE_<LANG>_COMPILE_OBJECT, CMAKE_<LANG>_CREATE_ASSEMBLY_SOURCE, and
+ # CMAKE_<LANG>_CREATE_PREPROCESSED_SOURCE commands
+ set(EXPLICIT_INCLUDES "<INCLUDES> ")
+endif()
+
+# Override the link rules:
+set(CMAKE_C_CREATE_SHARED_LIBRARY "echo 'shared libraries not supported' && 1")
+set(CMAKE_C_CREATE_SHARED_MODULE "echo 'shared modules not supported' && 1")
+set(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> -cr <LINK_FLAGS> <TARGET> <OBJECTS>")
+set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> ${EXPLICIT_INCLUDES}<FLAGS> -o <OBJECT> -c <SOURCE>")
+
+set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> -Wl,-Map,<TARGET>.map -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -lm -lc -lgcc -lm -lc -lgcc -Wl,--end-group --specs=nano.specs -o <TARGET>")
+
+set(CMAKE_CXX_OUTPUT_EXTENSION ".o")
+set(CMAKE_DEPFILE_FLAGS_CXX "-MMD -MT <OBJECT> -MF <DEPFILE>")
+set(CMAKE_C_OUTPUT_EXTENSION ".o")
+set(CMAKE_DEPFILE_FLAGS_C "-MMD -MT <OBJECT> -MF <DEPFILE>")
+
+set(CMAKE_C_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_C_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
+
+
+set(CMAKE_ASM_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_ASM_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_ASM_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_ASM_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_ASM "-isystem ")
+
+set(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_AR> -cr <LINK_FLAGS> <TARGET> <OBJECTS>")
+
+set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> -Wl,-Map,<TARGET>.map -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -lnosys -lstdc++ -lsupc++ -lm -lc -lgcc -lstdc++ -lsupc++ -lm -lc -lgcc -Wl,--end-group --specs=nano.specs -o <TARGET>")
+
+set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
+
+if (CMAKE_C_COMPILER_VERSION VERSION_GREATER "7.1.0" OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL "7.1.0")
+ message("${BoldRed}Supressing -Wexpansion-to-defined.${ColourReset}")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-expansion-to-defined")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-expansion-to-defined")
+endif () \ No newline at end of file
diff --git a/utils/cmake/toolchains/ARM_GCC/hex-generator.cmake b/utils/cmake/toolchains/ARM_GCC/hex-generator.cmake
new file mode 100644
index 0000000..4948935
--- /dev/null
+++ b/utils/cmake/toolchains/ARM_GCC/hex-generator.cmake
@@ -0,0 +1,9 @@
+add_custom_command(
+ OUTPUT "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex"
+ COMMAND "${ARM_NONE_EABI_OBJCOPY}" -O ihex "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${device.device}" "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex"
+ DEPENDS ${device.device}
+ COMMENT "converting to hex file."
+)
+
+#specify a dependency on the elf file so that hex is automatically rebuilt when elf is changed.
+add_custom_target(${device.device}_hex ALL DEPENDS "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex")
diff --git a/utils/cmake/toolchains/ARM_GCC/platform_includes.h b/utils/cmake/toolchains/ARM_GCC/platform_includes.h
new file mode 100644
index 0000000..3417ef3
--- /dev/null
+++ b/utils/cmake/toolchains/ARM_GCC/platform_includes.h
@@ -0,0 +1,10 @@
+#ifndef PLATFORM_INCLUDES
+#define PLATFORM_INCLUDES
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <math.h>
+
+#endif
diff --git a/utils/cmake/toolchains/ARM_GCC/toolchain.cmake b/utils/cmake/toolchains/ARM_GCC/toolchain.cmake
new file mode 100644
index 0000000..eafdfbc
--- /dev/null
+++ b/utils/cmake/toolchains/ARM_GCC/toolchain.cmake
@@ -0,0 +1,26 @@
+find_program(ARM_NONE_EABI_RANLIB arm-none-eabi-ranlib)
+find_program(ARM_NONE_EABI_AR arm-none-eabi-ar)
+find_program(ARM_NONE_EABI_GCC arm-none-eabi-gcc)
+find_program(ARM_NONE_EABI_GPP arm-none-eabi-g++)
+find_program(ARM_NONE_EABI_OBJCOPY arm-none-eabi-objcopy)
+
+set(CMAKE_OSX_SYSROOT "/")
+set(CMAKE_OSX_DEPLOYMENT_TARGET "")
+
+set(CODAL_TOOLCHAIN "ARM_GCC")
+
+if(CMAKE_VERSION VERSION_LESS "3.5.0")
+ include(CMakeForceCompiler)
+ cmake_force_c_compiler("${ARM_NONE_EABI_GCC}" GNU)
+ cmake_force_cxx_compiler("${ARM_NONE_EABI_GPP}" GNU)
+else()
+ # from 3.5 the force_compiler macro is deprecated: CMake can detect
+ # arm-none-eabi-gcc as being a GNU compiler automatically
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
+ set(CMAKE_C_COMPILER "${ARM_NONE_EABI_GCC}")
+ set(CMAKE_CXX_COMPILER "${ARM_NONE_EABI_GPP}")
+endif()
+
+SET(CMAKE_AR "${ARM_NONE_EABI_AR}" CACHE FILEPATH "Archiver")
+SET(CMAKE_RANLIB "${ARM_NONE_EABI_RANLIB}" CACHE FILEPATH "rlib")
+set(CMAKE_CXX_OUTPUT_EXTENSION ".o")
diff --git a/utils/cmake/toolchains/AVR_GCC/bin-generator.cmake b/utils/cmake/toolchains/AVR_GCC/bin-generator.cmake
new file mode 100644
index 0000000..a3a1c01
--- /dev/null
+++ b/utils/cmake/toolchains/AVR_GCC/bin-generator.cmake
@@ -0,0 +1,9 @@
+add_custom_command(
+ OUTPUT "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin"
+ COMMAND "${AVR_OBJCOPY}" -O binary "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${device.device}" "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin"
+ DEPENDS ${device.device}
+ COMMENT "converting to bin file."
+)
+
+#specify a dependency on the elf file so that bin is automatically rebuilt when elf is changed.
+add_custom_target(${device.device}_bin ALL DEPENDS "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin")
diff --git a/utils/cmake/toolchains/AVR_GCC/compiler-flags.cmake b/utils/cmake/toolchains/AVR_GCC/compiler-flags.cmake
new file mode 100644
index 0000000..c6dcfc7
--- /dev/null
+++ b/utils/cmake/toolchains/AVR_GCC/compiler-flags.cmake
@@ -0,0 +1,43 @@
+set(EXPLICIT_INCLUDES "")
+if((CMAKE_VERSION VERSION_GREATER "3.4.0") OR (CMAKE_VERSION VERSION_EQUAL "3.4.0"))
+ # from CMake 3.4 <INCLUDES> are separate to <FLAGS> in the
+ # CMAKE_<LANG>_COMPILE_OBJECT, CMAKE_<LANG>_CREATE_ASSEMBLY_SOURCE, and
+ # CMAKE_<LANG>_CREATE_PREPROCESSED_SOURCE commands
+ set(EXPLICIT_INCLUDES "<INCLUDES> ")
+endif()
+
+# Override the link rules:
+set(CMAKE_C_CREATE_SHARED_LIBRARY "echo 'shared libraries not supported' && 1")
+set(CMAKE_C_CREATE_SHARED_MODULE "echo 'shared modules not supported' && 1")
+set(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> rcs <LINK_FLAGS> <TARGET> <OBJECTS>")
+set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> ${EXPLICIT_INCLUDES}<FLAGS> -o <OBJECT> -c <SOURCE>")
+
+set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> -Wl,-Map,<TARGET>.map -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -lm -lc -lgcc -lm -lc -lgcc -Wl,--end-group --specs=nano.specs -o <TARGET>")
+
+set(CMAKE_CXX_OUTPUT_EXTENSION ".o")
+set(CMAKE_DEPFILE_FLAGS_CXX "-MMD -MT <OBJECT> -MF <DEPFILE>")
+set(CMAKE_C_OUTPUT_EXTENSION ".o")
+set(CMAKE_DEPFILE_FLAGS_C "-MMD -MT <OBJECT> -MF <DEPFILE>")
+
+set(CMAKE_C_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_C_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
+
+
+set(CMAKE_ASM_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_ASM_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_ASM_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_ASM_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_ASM "-isystem ")
+
+set(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_AR> rcs <LINK_FLAGS> <TARGET> <OBJECTS>")
+
+set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> -Wl,-Map,<TARGET>.map -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -lm -lc -lgcc -Wl,--end-group -o <TARGET>")
+
+set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
diff --git a/utils/cmake/toolchains/AVR_GCC/hex-generator.cmake b/utils/cmake/toolchains/AVR_GCC/hex-generator.cmake
new file mode 100644
index 0000000..5be3c67
--- /dev/null
+++ b/utils/cmake/toolchains/AVR_GCC/hex-generator.cmake
@@ -0,0 +1,9 @@
+add_custom_command(
+ OUTPUT "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex"
+ COMMAND "${AVR_OBJCOPY}" -O ihex "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${device.device}" "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex"
+ DEPENDS ${device.device}
+ COMMENT "converting to hex file."
+)
+
+#specify a dependency on the elf file so that hex is automatically rebuilt when elf is changed.
+add_custom_target(${device.device}_hex ALL DEPENDS "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex")
diff --git a/utils/cmake/toolchains/AVR_GCC/platform_includes.h b/utils/cmake/toolchains/AVR_GCC/platform_includes.h
new file mode 100644
index 0000000..ac788a5
--- /dev/null
+++ b/utils/cmake/toolchains/AVR_GCC/platform_includes.h
@@ -0,0 +1,14 @@
+#ifndef PLATFORM_INCLUDES
+#define PLATFORM_INCLUDES
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <math.h>
+#include <avr/interrupt.h>
+#include <avr/io.h>
+
+#endif
diff --git a/utils/cmake/toolchains/AVR_GCC/toolchain.cmake b/utils/cmake/toolchains/AVR_GCC/toolchain.cmake
new file mode 100644
index 0000000..891aff2
--- /dev/null
+++ b/utils/cmake/toolchains/AVR_GCC/toolchain.cmake
@@ -0,0 +1,29 @@
+find_program(AVR_GCC_RANLIB avr-gcc-ranlib)
+find_program(AVR_AR avr-ar)
+find_program(AVR_AS avr-as)
+find_program(AVR_GCC avr-gcc)
+find_program(AVR_GPP avr-g++)
+find_program(AVR_OBJCOPY avr-objcopy)
+
+set(CMAKE_OSX_SYSROOT "/")
+set(CMAKE_OSX_DEPLOYMENT_TARGET "")
+
+set(CODAL_TOOLCHAIN "AVR_GCC")
+
+if(CMAKE_VERSION VERSION_LESS "3.5.0")
+ include(CMakeForceCompiler)
+ cmake_force_c_compiler("${AVR_GCC}" GNU)
+ cmake_force_cxx_compiler("${AVR_GPP}" GNU)
+else()
+ #-Wl,-flto -flto -fno-fat-lto-objects
+ # from 3.5 the force_compiler macro is deprecated: CMake can detect
+ # arm-none-eabi-gcc as being a GNU compiler automatically
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
+ set(CMAKE_C_COMPILER "${AVR_GCC}")
+ set(CMAKE_CXX_COMPILER "${AVR_GPP}")
+endif()
+
+SET(CMAKE_ASM_COMPILER "${AVR_GCC}")
+SET(CMAKE_AR "${AVR_AR}" CACHE FILEPATH "Archiver")
+SET(CMAKE_RANLIB "${AVR_GCC_RANLIB}" CACHE FILEPATH "rlib")
+set(CMAKE_CXX_OUTPUT_EXTENSION ".o")
diff --git a/utils/cmake/toolchains/XTENSA_GCC/bin-generator.cmake b/utils/cmake/toolchains/XTENSA_GCC/bin-generator.cmake
new file mode 100644
index 0000000..74fdb35
--- /dev/null
+++ b/utils/cmake/toolchains/XTENSA_GCC/bin-generator.cmake
@@ -0,0 +1,9 @@
+add_custom_command(
+ OUTPUT "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin"
+ COMMAND "${XTENSA_OBJCOPY}" -O binary "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${device.device}" "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin"
+ DEPENDS ${device.device}
+ COMMENT "converting to bin file."
+)
+
+#specify a dependency on the elf file so that bin is automatically rebuilt when elf is changed.
+add_custom_target(${device.device}_bin ALL DEPENDS "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.bin")
diff --git a/utils/cmake/toolchains/XTENSA_GCC/compiler-flags.cmake b/utils/cmake/toolchains/XTENSA_GCC/compiler-flags.cmake
new file mode 100644
index 0000000..e0f7e2d
--- /dev/null
+++ b/utils/cmake/toolchains/XTENSA_GCC/compiler-flags.cmake
@@ -0,0 +1,43 @@
+set(EXPLICIT_INCLUDES "")
+if((CMAKE_VERSION VERSION_GREATER "3.4.0") OR (CMAKE_VERSION VERSION_EQUAL "3.4.0"))
+ # from CMake 3.4 <INCLUDES> are separate to <FLAGS> in the
+ # CMAKE_<LANG>_COMPILE_OBJECT, CMAKE_<LANG>_CREATE_ASSEMBLY_SOURCE, and
+ # CMAKE_<LANG>_CREATE_PREPROCESSED_SOURCE commands
+ set(EXPLICIT_INCLUDES "<INCLUDES> ")
+endif()
+
+# Override the link rules:
+set(CMAKE_C_CREATE_SHARED_LIBRARY "echo 'shared libraries not supported' && 1")
+set(CMAKE_C_CREATE_SHARED_MODULE "echo 'shared modules not supported' && 1")
+set(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> -cr <LINK_FLAGS> <TARGET> <OBJECTS>")
+set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> ${EXPLICIT_INCLUDES}<FLAGS> -o <OBJECT> -c <SOURCE>")
+
+set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> -nostdlib -Wl,-Map,<TARGET>.map -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -lupgrade -lssl -lmesh -lwpa2 -lsmartconfig -lespnow -lpp -lmain -lwpa -llwip -lnet80211 -lwps -lcrypto -lphy -lhal -lgcc -ldriver -lm -lat -lc -lstdc++ -Wl,--end-group -lgcc -o <TARGET>")
+
+set(CMAKE_CXX_OUTPUT_EXTENSION ".o")
+set(CMAKE_DEPFILE_FLAGS_CXX "-MMD -MT <OBJECT> -MF <DEPFILE>")
+set(CMAKE_C_OUTPUT_EXTENSION ".o")
+set(CMAKE_DEPFILE_FLAGS_C "-MMD -MT <OBJECT> -MF <DEPFILE>")
+
+set(CMAKE_C_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_C_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
+
+
+set(CMAKE_ASM_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_ASM_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_ASM_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_ASM_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_ASM "-isystem ")
+
+set(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_AR> -cr <LINK_FLAGS> <TARGET> <OBJECTS>")
+set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> -nostdlib -Wl,-Map,<TARGET>.map -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -lupgrade -lssl -lmesh -lwpa2 -lsmartconfig -lespnow -lpp -lmain -lwpa -llwip -lnet80211 -lwps -lcrypto -ldriver -lat -lphy -lhal -lgcc -lm -lc -lstdc++ -o <TARGET>")
+#set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> -nostdlib -Wl,-Map,<TARGET>.map -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -lpwm -lupgrade -lssl -lgcc -lhal -lphy -lpp -lnet80211 -lwpa -lmain -llwip -lcrypto -lm -lc -o <TARGET>")
+
+set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g -gdwarf-3")
+set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Os -DNDEBUG")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-Os -g -gdwarf-3 -DNDEBUG")
+set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
diff --git a/utils/cmake/toolchains/XTENSA_GCC/hex-generator.cmake b/utils/cmake/toolchains/XTENSA_GCC/hex-generator.cmake
new file mode 100644
index 0000000..4948935
--- /dev/null
+++ b/utils/cmake/toolchains/XTENSA_GCC/hex-generator.cmake
@@ -0,0 +1,9 @@
+add_custom_command(
+ OUTPUT "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex"
+ COMMAND "${ARM_NONE_EABI_OBJCOPY}" -O ihex "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${device.device}" "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex"
+ DEPENDS ${device.device}
+ COMMENT "converting to hex file."
+)
+
+#specify a dependency on the elf file so that hex is automatically rebuilt when elf is changed.
+add_custom_target(${device.device}_hex ALL DEPENDS "${PROJECT_SOURCE_DIR}/${codal.output_folder}/${device.device}.hex")
diff --git a/utils/cmake/toolchains/XTENSA_GCC/platform_includes.h b/utils/cmake/toolchains/XTENSA_GCC/platform_includes.h
new file mode 100644
index 0000000..3417ef3
--- /dev/null
+++ b/utils/cmake/toolchains/XTENSA_GCC/platform_includes.h
@@ -0,0 +1,10 @@
+#ifndef PLATFORM_INCLUDES
+#define PLATFORM_INCLUDES
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <math.h>
+
+#endif
diff --git a/utils/cmake/toolchains/XTENSA_GCC/toolchain.cmake b/utils/cmake/toolchains/XTENSA_GCC/toolchain.cmake
new file mode 100644
index 0000000..6789edd
--- /dev/null
+++ b/utils/cmake/toolchains/XTENSA_GCC/toolchain.cmake
@@ -0,0 +1,26 @@
+find_program(XTENSA_RANLIB xtensa-lx106-elf-gcc-ranlib)
+find_program(XTENSA_AR xtensa-lx106-elf-gcc-ar)
+find_program(XTENSA_GCC xtensa-lx106-elf-gcc)
+find_program(XTENSA_GPP xtensa-lx106-elf-g++)
+find_program(XTENSA_OBJCOPY xtensa-lx106-elf-objcopy)
+
+set(CMAKE_OSX_SYSROOT "/")
+set(CMAKE_OSX_DEPLOYMENT_TARGET "")
+
+set(CODAL_TOOLCHAIN "XTENSA_GCC")
+
+if(CMAKE_VERSION VERSION_LESS "3.5.0")
+ include(CMakeForceCompiler)
+ cmake_force_c_compiler("${XTENSA_GCC}" GNU)
+ cmake_force_cxx_compiler("${XTENSA_GPP}" GNU)
+else()
+ # from 3.5 the force_compiler macro is deprecated: CMake can detect
+ # arm-none-eabi-gcc as being a GNU compiler automatically
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
+ set(CMAKE_C_COMPILER "${XTENSA_GCC}")
+ set(CMAKE_CXX_COMPILER "${XTENSA_GPP}")
+endif()
+
+SET(CMAKE_AR "${XTENSA_AR}" CACHE FILEPATH "Archiver")
+SET(CMAKE_RANLIB "${XTENSA_RANLIB}" CACHE FILEPATH "rlib")
+set(CMAKE_CXX_OUTPUT_EXTENSION ".o")
diff --git a/utils/cmake/util.cmake b/utils/cmake/util.cmake
new file mode 100644
index 0000000..6e3a815
--- /dev/null
+++ b/utils/cmake/util.cmake
@@ -0,0 +1,156 @@
+MACRO(RECURSIVE_FIND_DIR return_list dir pattern)
+ FILE(GLOB_RECURSE new_list "${dir}/${pattern}")
+ SET(dir_list "")
+ FOREACH(file_path ${new_list})
+ GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
+ SET(dir_list ${dir_list} ${dir_path})
+ ENDFOREACH()
+ LIST(REMOVE_DUPLICATES dir_list)
+ SET(${return_list} ${dir_list})
+ENDMACRO()
+
+MACRO(RECURSIVE_FIND_FILE return_list dir pattern)
+ FILE(GLOB_RECURSE new_list "${dir}/${pattern}")
+ SET(dir_list "")
+ FOREACH(file_path ${new_list})
+ SET(dir_list ${dir_list} ${file_path})
+ ENDFOREACH()
+ LIST(REMOVE_DUPLICATES dir_list)
+ SET(${return_list} ${dir_list})
+ENDMACRO()
+
+MACRO(SOURCE_FILES return_list dir pattern)
+ FILE(GLOB new_list "${dir}/${pattern}")
+ SET(dir_list "")
+ FOREACH(file_path ${new_list})
+ LIST(APPEND dir_list ${file_path})
+ ENDFOREACH()
+ LIST(REMOVE_DUPLICATES dir_list)
+ SET(${return_list} ${dir_list})
+ENDMACRO()
+
+function(EXTRACT_JSON_ARRAY json_file json_field_path fields values)
+
+ set(VALUES "")
+ set(FIELDS "")
+
+ foreach(var ${${json_file}})
+ # extract any cmd line definitions specified in the json object, and add them
+ # if it is not prefixed by json_field_path, do not consider the key.
+ if("${var}" MATCHES "${json_field_path}")
+ string(REGEX MATCH "[^${json_field_path}]([A-Z,a-z,0-9,_,]+)" VALUE "${var}")
+
+ # never quote the value - gives more flexibility
+ list(APPEND FIELDS ${VALUE})
+ list(APPEND VALUES "${${var}}")
+ endif()
+ endforeach()
+
+ set(${fields} ${FIELDS} PARENT_SCOPE)
+ set(${values} ${VALUES} PARENT_SCOPE)
+endfunction()
+
+function(FORM_DEFINITIONS fields values definitions)
+
+ set(DEFINITIONS "")
+ list(LENGTH ${fields} LEN)
+
+ # - 1 for for loop index...
+ MATH(EXPR LEN "${LEN}-1")
+
+ foreach(i RANGE ${LEN})
+ list(GET ${fields} ${i} DEFINITION)
+ list(GET ${values} ${i} VALUE)
+
+ set(DEFINITIONS "${DEFINITIONS} #define ${DEFINITION}\t ${VALUE}\n")
+ endforeach()
+
+ set(${definitions} ${DEFINITIONS} PARENT_SCOPE)
+endfunction()
+
+function(UNIQUE_JSON_KEYS priority_fields priority_values secondary_fields secondary_values merged_fields merged_values)
+
+ # always keep the first fields and values
+ set(MERGED_FIELDS ${${priority_fields}})
+ set(MERGED_VALUES ${${priority_values}})
+
+ # measure the second set...
+ list(LENGTH ${secondary_fields} LEN)
+ # - 1 for for loop index...
+ MATH(EXPR LEN "${LEN}-1")
+
+ # iterate, dropping any duplicate fields regardless of the value
+ foreach(i RANGE ${LEN})
+ list(GET ${secondary_fields} ${i} FIELD)
+ list(GET ${secondary_values} ${i} VALUE)
+
+ list(FIND MERGED_FIELDS ${FIELD} INDEX)
+
+ if (${INDEX} GREATER -1)
+ continue()
+ endif()
+
+ list(APPEND MERGED_FIELDS ${FIELD})
+ list(APPEND MERGED_VALUES ${VALUE})
+ endforeach()
+
+ set(${merged_fields} ${MERGED_FIELDS} PARENT_SCOPE)
+ set(${merged_values} ${MERGED_VALUES} PARENT_SCOPE)
+endfunction()
+
+MACRO(HEADER_FILES return_list dir)
+ FILE(GLOB new_list "${dir}/*.h")
+ SET(${return_list} ${new_list})
+ENDMACRO()
+
+function(INSTALL_DEPENDENCY dir name url branch type)
+ if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/${dir}")
+ message("Creating libraries folder")
+ FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/${dir}")
+ endif()
+
+ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}")
+ message("${name} is already installed")
+ return()
+ endif()
+
+ if(${type} STREQUAL "git")
+ message("Cloning into: ${url}")
+ # git clone -b doesn't work with SHAs
+ execute_process(
+ COMMAND git clone --recurse-submodules ${url} ${name}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}
+ )
+
+ if(NOT "${branch}" STREQUAL "")
+ message("Checking out branch: ${branch}")
+ execute_process(
+ COMMAND git -c advice.detachedHead=false checkout ${branch}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ execute_process(
+ COMMAND git submodule update --init
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ execute_process(
+ COMMAND git submodule sync
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ execute_process(
+ COMMAND git submodule update
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ endif()
+ else()
+ message("No mechanism exists to install this library.")
+ endif()
+endfunction()
+
+MACRO(SUB_DIRS return_dirs dir)
+ FILE(GLOB list "${PROJECT_SOURCE_DIR}/${dir}/*")
+ SET(dir_list "")
+ FOREACH(file_path ${list})
+ SET(dir_list ${dir_list} ${file_path})
+ ENDFOREACH()
+ set(${return_dirs} ${dir_list})
+ENDMACRO()