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

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

Extracted core functions #13

Merged
merged 12 commits into from
Nov 3, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,876 changes: 76 additions & 1,800 deletions cmake/Platform/Arduino.cmake

Large diffs are not rendered by default.

28 changes: 28 additions & 0 deletions cmake/Platform/Core/BoardFlags/CompilerFlagsSetter.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# ToDo: Comment
function(set_board_compiler_flags COMPILER_FLAGS ARDUINO_DEFINED_VERSION BOARD_ID IS_MANUAL)

set(COMPILE_FLAGS "-DF_CPU=${${BOARD_ID}.build.f_cpu} -DARDUINO=${ARDUINO_DEFINED_VERSION} -mmcu=${${BOARD_ID}.build.mcu}")
if (DEFINED ${BOARD_ID}.build.vid)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -DUSB_VID=${${BOARD_ID}.build.vid}")
endif ()
if (DEFINED ${BOARD_ID}.build.pid)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -DUSB_PID=${${BOARD_ID}.build.pid}")
endif ()
if (NOT IS_MANUAL)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -I\"${${BOARD_CORE}.path}\" -I\"${ARDUINO_LIBRARIES_PATH}\"")
if (${ARDUINO_PLATFORM_LIBRARIES_PATH})
set(COMPILE_FLAGS "${COMPILE_FLAGS} -I\"${ARDUINO_PLATFORM_LIBRARIES_PATH}\"")
endif ()
endif ()
if (ARDUINO_SDK_VERSION VERSION_GREATER 1.0 OR ARDUINO_SDK_VERSION VERSION_EQUAL 1.0)
if (NOT IS_MANUAL)
set(PIN_HEADER ${${${BOARD_ID}.build.variant}.path})
if (PIN_HEADER)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -I\"${PIN_HEADER}\"")
endif ()
endif ()
endif ()

set(${COMPILER_FLAGS} "${COMPILE_FLAGS}" PARENT_SCOPE)

endfunction()
61 changes: 61 additions & 0 deletions cmake/Platform/Core/BoardFlags/FlagsSetter.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
include(CompilerFlagsSetter)
include(LinkerFlagsSetter)

#=============================================================================#
# get_arduino_flags
# [PRIVATE/INTERNAL]
#
# get_arduino_flags(COMPILE_FLAGS LINK_FLAGS BOARD_ID IS_MANUAL)
#
# COMPILER_FLAGS -Variable holding compiler flags
# LINKER_FLAGS - Variable holding linker flags
# BOARD_ID - The board id name
# IS_MANUAL - (Advanced) Only use AVR Libc/Includes
#
# Configures the the build settings for the specified Arduino Board.
#
#=============================================================================#
function(set_board_flags COMPILER_FLAGS LINKER_FLAGS BOARD_ID IS_MANUAL)

set(BOARD_CORE ${${BOARD_ID}.build.core})
if (BOARD_CORE)
is_sdk_version_valid(IS_VERSION_VALID DEFINED_VERSION)
if (NOT ${IS_VERSION_VALID})
return()
endif ()

set_board_compiler_flags(COMPILE_FLAGS ${DEFINED_VERSION} ${BOARD_ID} ${IS_MANUAL})
set_board_linker_flags(LINK_FLAGS ${BOARD_ID} ${IS_MANUAL})

# output
set(${COMPILER_FLAGS} "${COMPILE_FLAGS}" PARENT_SCOPE)
set(${LINKER_FLAGS} "${LINK_FLAGS}" PARENT_SCOPE)

else ()
message(FATAL_ERROR "Invalid Arduino board ID (${BOARD_ID}), aborting.")
endif ()

endfunction()

function(is_sdk_version_valid IS_VALID OUTPUT_VAR)

if (ARDUINO_SDK_VERSION MATCHES "([0-9]+)[.]([0-9]+)")
string(REPLACE "." "" ARDUINO_VERSION_DEFINE "${ARDUINO_SDK_VERSION}") # Normalize version (remove all periods)
set(ARDUINO_VERSION_DEFINE "")
if (CMAKE_MATCH_1 GREATER 0)
set(ARDUINO_VERSION_DEFINE "${CMAKE_MATCH_1}")
endif ()
if (CMAKE_MATCH_2 GREATER 10)
set(ARDUINO_VERSION_DEFINE "${ARDUINO_VERSION_DEFINE}${CMAKE_MATCH_2}")
else ()
set(ARDUINO_VERSION_DEFINE "${ARDUINO_VERSION_DEFINE}0${CMAKE_MATCH_2}")
endif ()
else ()
message(WARNING "Invalid Arduino SDK Version (${ARDUINO_SDK_VERSION})")
set(${IS_VALID} False PARENT_SCOPE)
endif ()

set(${IS_VALID} True PARENT_SCOPE)
set(${OUTPUT_VAR} ${ARDUINO_VERSION_DEFINE} PARENT_SCOPE)

endfunction()
7 changes: 7 additions & 0 deletions cmake/Platform/Core/BoardFlags/LinkerFlagsSetter.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# ToDo: Comment
function(set_board_linker_flags LINKER_FLAGS BOARD_ID IS_MANUAL)

set(LINK_FLAGS "-mmcu=${${BOARD_ID}.build.mcu}")
set(${LINKER_FLAGS} "${LINK_FLAGS}" PARENT_SCOPE)

endfunction()
70 changes: 70 additions & 0 deletions cmake/Platform/Core/Examples/ArduinoExampleFactory.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#=============================================================================#
# make_arduino_example
# [PRIVATE/INTERNAL]
#
# make_arduino_example(TARGET_NAME EXAMPLE_NAME OUTPUT_VAR [CATEGORY_NAME])
#
# TARGET_NAME - Target name
# EXAMPLE_NAME - Example name
# OUTPUT_VAR - Variable name to save sketch path.
# [CATEGORY_NAME] - Optional name of the example's parent category, such as 'Basics' is for 'Blink'.
#
# Creates an Arduino example from the built-in categories.
#=============================================================================#
function(make_arduino_example TARGET_NAME EXAMPLE_NAME OUTPUT_VAR)

set(OPTIONAL_ARGUMENTS ${ARGN})
list(LENGTH OPTIONAL_ARGUMENTS ARGC)
if (${ARGC} GREATER 0)
list(GET OPTIONAL_ARGUMENTS 0 CATEGORY_NAME)
endif ()

# Case-insensitive support
string(TOLOWER ${EXAMPLE_NAME} EXAMPLE_NAME)

if (CATEGORY_NAME)
string(TOLOWER ${CATEGORY_NAME} LOWER_CATEGORY_NAME)
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()
endif ()
INCREMENT_EXAMPLE_CATEGORY_INDEX(CATEGORY_INDEX)
set(CATEGORY_NAME ${CATEGORY_INDEX}.${CATEGORY_NAME})
file(GLOB EXAMPLES RELATIVE ${ARDUINO_EXAMPLES_PATH}/${CATEGORY_NAME}
${ARDUINO_EXAMPLES_PATH}/${CATEGORY_NAME}/*)
foreach (EXAMPLE_PATH ${EXAMPLES})
string(TOLOWER ${EXAMPLE_PATH} LOWER_EXAMPLE_PATH)
if (${LOWER_EXAMPLE_PATH} STREQUAL ${EXAMPLE_NAME})
set(EXAMPLE_SKETCH_PATH
"${ARDUINO_EXAMPLES_PATH}/${CATEGORY_NAME}/${EXAMPLE_PATH}")
break()
endif ()
endforeach ()

else ()

file(GLOB CATEGORIES RELATIVE ${ARDUINO_EXAMPLES_PATH} ${ARDUINO_EXAMPLES_PATH}/*)
foreach (CATEGORY_PATH ${CATEGORIES})
file(GLOB EXAMPLES RELATIVE ${ARDUINO_EXAMPLES_PATH}/${CATEGORY_PATH}
${ARDUINO_EXAMPLES_PATH}/${CATEGORY_PATH}/*)
foreach (EXAMPLE_PATH ${EXAMPLES})
string(TOLOWER ${EXAMPLE_PATH} LOWER_EXAMPLE_PATH)
if (${LOWER_EXAMPLE_PATH} STREQUAL ${EXAMPLE_NAME})
set(EXAMPLE_SKETCH_PATH
"${ARDUINO_EXAMPLES_PATH}/${CATEGORY_PATH}/${EXAMPLE_PATH}")
break()
endif ()
endforeach ()
endforeach ()

endif ()

if (EXAMPLE_SKETCH_PATH)
make_arduino_sketch(${TARGET_NAME} ${EXAMPLE_SKETCH_PATH} SKETCH_CPP)
set("${OUTPUT_VAR}" ${${OUTPUT_VAR}} ${SKETCH_CPP} PARENT_SCOPE)
else ()
message(FATAL_ERROR "Could not find example ${EXAMPLE_NAME}")
endif ()

endfunction()
35 changes: 35 additions & 0 deletions cmake/Platform/Core/Examples/ArduinoLibraryExampleFactory.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#=============================================================================#
# make_arduino_library_example
# [PRIVATE/INTERNAL]
#
# make_arduino_library_example(TARGET_NAME LIBRARY_NAME EXAMPLE_NAME OUTPUT_VAR)
#
# TARGET_NAME - Target name
# LIBRARY_NAME - Library name
# EXAMPLE_NAME - Example name
# OUTPUT_VAR - Variable name to save sketch path.
#
# Creates a Arduino example from the specified library.
#=============================================================================#
function(make_arduino_library_example TARGET_NAME LIBRARY_NAME EXAMPLE_NAME OUTPUT_VAR)
set(EXAMPLE_SKETCH_PATH)

get_property(LIBRARY_SEARCH_PATH
DIRECTORY # Property Scope
PROPERTY LINK_DIRECTORIES)
foreach (LIB_SEARCH_PATH ${LIBRARY_SEARCH_PATH} ${ARDUINO_LIBRARIES_PATH}
${ARDUINO_PLATFORM_LIBRARIES_PATH} ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/libraries)
if (EXISTS "${LIB_SEARCH_PATH}/${LIBRARY_NAME}/examples/${EXAMPLE_NAME}")
set(EXAMPLE_SKETCH_PATH "${LIB_SEARCH_PATH}/${LIBRARY_NAME}/examples/${EXAMPLE_NAME}")
break()
endif ()
endforeach ()

if (EXAMPLE_SKETCH_PATH)
make_arduino_sketch(${TARGET_NAME} ${EXAMPLE_SKETCH_PATH} SKETCH_CPP)
set("${OUTPUT_VAR}" ${${OUTPUT_VAR}} ${SKETCH_CPP} PARENT_SCOPE)
else ()
message(FATAL_ERROR "Could not find example ${EXAMPLE_NAME} from library ${LIBRARY_NAME}")
endif ()
endfunction()
103 changes: 103 additions & 0 deletions cmake/Platform/Core/Libraries/ArduinoLibraryFactory.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#=============================================================================#
# make_arduino_library
# [PRIVATE/INTERNAL]
#
# make_arduino_library(VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLAGS)
#
# VAR_NAME - Vairable wich will hold the generated library names
# BOARD_ID - Board ID
# LIB_PATH - Path of the library
# COMPILE_FLAGS - Compile flags
# LINK_FLAGS - Link flags
#
# Creates an Arduino library, with all it's library dependencies.
#
# ${LIB_NAME}_RECURSE controls if the library will recurse
# when looking for source files.
#
#=============================================================================#
function(make_arduino_library VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLAGS)

string(REGEX REPLACE "/src/?$" "" LIB_PATH_STRIPPED ${LIB_PATH})
get_filename_component(LIB_NAME ${LIB_PATH_STRIPPED} NAME)
set(TARGET_LIB_NAME ${BOARD_ID}_${LIB_NAME})

if (NOT TARGET ${TARGET_LIB_NAME})
string(REGEX REPLACE ".*/" "" LIB_SHORT_NAME ${LIB_NAME})

# Detect if recursion is needed
if (NOT DEFINED ${LIB_SHORT_NAME}_RECURSE)
set(${LIB_SHORT_NAME}_RECURSE False)
endif ()

find_sources(LIB_SRCS ${LIB_PATH} ${${LIB_SHORT_NAME}_RECURSE})
if (LIB_SRCS)

arduino_debug_msg("Generating Arduino ${LIB_NAME} library")
add_library(${TARGET_LIB_NAME} STATIC ${LIB_SRCS})

set_board_flags(ARDUINO_COMPILE_FLAGS ARDUINO_LINK_FLAGS ${BOARD_ID} FALSE)

find_arduino_libraries(LIB_DEPS "${LIB_SRCS}" "")

foreach (LIB_DEP ${LIB_DEPS})
make_arduino_library(DEP_LIB_SRCS ${BOARD_ID} ${LIB_DEP}
"${COMPILE_FLAGS}" "${LINK_FLAGS}")
list(APPEND LIB_TARGETS ${DEP_LIB_SRCS})
list(APPEND LIB_INCLUDES ${DEP_LIB_SRCS_INCLUDES})
endforeach ()

if (LIB_INCLUDES)
string(REPLACE ";" " " LIB_INCLUDES "${LIB_INCLUDES}")
endif ()

set_target_properties(${TARGET_LIB_NAME} PROPERTIES
COMPILE_FLAGS "${ARDUINO_COMPILE_FLAGS} ${LIB_INCLUDES} -I\"${LIB_PATH}\" -I\"${LIB_PATH}/utility\" ${COMPILE_FLAGS}"
LINK_FLAGS "${ARDUINO_LINK_FLAGS} ${LINK_FLAGS}")
list(APPEND LIB_INCLUDES "-I\"${LIB_PATH}\" -I\"${LIB_PATH}/utility\"")

if (LIB_TARGETS)
list(REMOVE_ITEM LIB_TARGETS ${TARGET_LIB_NAME})
endif ()
target_link_libraries(${TARGET_LIB_NAME} ${BOARD_ID}_CORE ${LIB_TARGETS})
list(APPEND LIB_TARGETS ${TARGET_LIB_NAME})

endif ()
else ()
# Target already exists, skiping creating
list(APPEND LIB_TARGETS ${TARGET_LIB_NAME})
endif ()
if (LIB_TARGETS)
list(REMOVE_DUPLICATES LIB_TARGETS)
endif ()
set(${VAR_NAME} ${LIB_TARGETS} PARENT_SCOPE)
set(${VAR_NAME}_INCLUDES ${LIB_INCLUDES} PARENT_SCOPE)
endfunction()

#=============================================================================#
# make_arduino_libraries
# [PRIVATE/INTERNAL]
#
# make_arduino_libraries(VAR_NAME BOARD_ID SRCS COMPILE_FLAGS LINK_FLAGS)
#
# VAR_NAME - Vairable wich will hold the generated library names
# BOARD_ID - Board ID
# SRCS - source files
# COMPILE_FLAGS - Compile flags
# LINK_FLAGS - Linker flags
#
# Finds and creates all dependency libraries based on sources.
#
#=============================================================================#
function(make_arduino_libraries VAR_NAME BOARD_ID SRCS ARDLIBS COMPILE_FLAGS LINK_FLAGS)
foreach (TARGET_LIB ${ARDLIBS})
# Create static library instead of returning sources
make_arduino_library(LIB_DEPS ${BOARD_ID} ${TARGET_LIB}
"${COMPILE_FLAGS}" "${LINK_FLAGS}")
list(APPEND LIB_TARGETS ${LIB_DEPS})
list(APPEND LIB_INCLUDES ${LIB_DEPS_INCLUDES})
endforeach ()

set(${VAR_NAME} ${LIB_TARGETS} PARENT_SCOPE)
set(${VAR_NAME}_INCLUDES ${LIB_INCLUDES} PARENT_SCOPE)
endfunction()
31 changes: 31 additions & 0 deletions cmake/Platform/Core/Libraries/CoreLibraryFactory.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#=============================================================================#
# make_core_library
# [PRIVATE/INTERNAL]
#
# make_core_library(OUTPUT_VAR BOARD_ID)
#
# OUTPUT_VAR - Variable name that will hold the generated library name
# BOARD_ID - Arduino board id
#
# Creates the Arduino Core library for the specified board,
# each board gets it's own version of the library.
#
#=============================================================================#
function(make_core_library OUTPUT_VAR BOARD_ID)
set(CORE_LIB_NAME ${BOARD_ID}_CORE)
set(BOARD_CORE ${${BOARD_ID}.build.core})
if (BOARD_CORE)
if (NOT TARGET ${CORE_LIB_NAME})
set(BOARD_CORE_PATH ${${BOARD_CORE}.path})
find_sources(CORE_SRCS ${BOARD_CORE_PATH} True)
# Debian/Ubuntu fix
list(REMOVE_ITEM CORE_SRCS "${BOARD_CORE_PATH}/main.cxx")
add_library(${CORE_LIB_NAME} ${CORE_SRCS})
set_board_flags(ARDUINO_COMPILE_FLAGS ARDUINO_LINK_FLAGS ${BOARD_ID} FALSE)
set_target_properties(${CORE_LIB_NAME} PROPERTIES
COMPILE_FLAGS "${ARDUINO_COMPILE_FLAGS}"
LINK_FLAGS "${ARDUINO_LINK_FLAGS}")
endif ()
set(${OUTPUT_VAR} ${CORE_LIB_NAME} PARENT_SCOPE)
endif ()
endfunction()
Loading