Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding support for SDK 1.5 #104

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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
4 changes: 4 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,10 @@ The following options control how **Arduino CMake** is configured:
+---------------------------------+-----------------------------------------------------+
| **ARDUINO_DEFAULT_BOARD** | Default Arduino Board ID, when not specified. |
+---------------------------------+-----------------------------------------------------+
| **ARDUINO_CPU** | Selected CPU from Arduino 1.5 menu boards. For mega |
| | board, for example, you have to set atmega2560 |
| | before including ARDUINO ToolChain |
+---------------------------------+-----------------------------------------------------+
| **ARDUINO_DEFAULT_PORT** | Default Arduino port, when not specified. |
+---------------------------------+-----------------------------------------------------+
| **ARDUINO_DEFAULT_SERIAL** | Default Arduino Serial command, when not specified. |
Expand Down
5 changes: 5 additions & 0 deletions cmake/ArduinoToolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,8 @@ else()
message(FATAL_ERROR "Could not find Arduino SDK (set ARDUINO_SDK_PATH)!")
endif()

set(ARDUINO_CPUMENU)
if(ARDUINO_CPU)
set(ARDUINO_CPUMENU ".menu.cpu.${ARDUINO_CPU}")
endif(ARDUINO_CPU)

112 changes: 80 additions & 32 deletions cmake/Platform/Arduino.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ function(GENERATE_ARDUINO_FIRMWARE INPUT_NAME)
find_arduino_libraries(TARGET_LIBS "${ALL_SRCS}" "${INPUT_ARDLIBS}")
foreach(LIB_DEP ${TARGET_LIBS})
arduino_debug_msg("Arduino Library: ${LIB_DEP}")
set(LIB_DEP_INCLUDES "${LIB_DEP_INCLUDES} -I\"${LIB_DEP}\"")
set(LIB_DEP_INCLUDES "${LIB_DEP_INCLUDES} -I\"${LIB_DEP}\" -I\"${LIB_DEP}/src\"")
endforeach()

if(NOT INPUT_NO_AUTOLIBS)
Expand Down Expand Up @@ -669,6 +669,11 @@ function(REGISTER_HARDWARE_PLATFORM PLATFORM_PATH)
PATHS ${PLATFORM_PATH}
DOC "Path to directory containing the Arduino bootloader images and sources.")

find_file(${PLATFORM}_LIBRARIES_PATH
NAMES libraries
PATHS ${PLATFORM_PATH}
DOC "Path to directory containing the Arduino hardware libraries sources.")

find_file(${PLATFORM}_PROGRAMMERS_PATH
NAMES programmers.txt
PATHS ${PLATFORM_PATH}
Expand Down Expand Up @@ -708,6 +713,7 @@ function(REGISTER_HARDWARE_PLATFORM PLATFORM_PATH)
endif()
endforeach()
endif()

endif()
endif()

Expand Down Expand Up @@ -802,7 +808,7 @@ function(get_arduino_flags COMPILE_FLAGS_VAR LINK_FLAGS_VAR BOARD_ID MANUAL)
endif()

# output
set(COMPILE_FLAGS "-DF_CPU=${${BOARD_ID}.build.f_cpu} -DARDUINO=${ARDUINO_VERSION_DEFINE} -mmcu=${${BOARD_ID}.build.mcu}")
set(COMPILE_FLAGS "-DF_CPU=${${BOARD_ID}.build.f_cpu} -DARDUINO=${ARDUINO_VERSION_DEFINE} -mmcu=${${BOARD_ID}${ARDUINO_CPUMENU}.build.mcu}")
if(DEFINED ${BOARD_ID}.build.vid)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -DUSB_VID=${${BOARD_ID}.build.vid}")
endif()
Expand All @@ -812,7 +818,7 @@ function(get_arduino_flags COMPILE_FLAGS_VAR LINK_FLAGS_VAR BOARD_ID MANUAL)
if(NOT MANUAL)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -I\"${${BOARD_CORE}.path}\" -I\"${ARDUINO_LIBRARIES_PATH}\"")
endif()
set(LINK_FLAGS "-mmcu=${${BOARD_ID}.build.mcu}")
set(LINK_FLAGS "-mmcu=${${BOARD_ID}${ARDUINO_CPUMENU}.build.mcu}")
if(ARDUINO_SDK_VERSION VERSION_GREATER 1.0 OR ARDUINO_SDK_VERSION VERSION_EQUAL 1.0)
if(NOT MANUAL)
set(PIN_HEADER ${${${BOARD_ID}.build.variant}.path})
Expand Down Expand Up @@ -920,11 +926,15 @@ function(find_arduino_libraries VAR_NAME SRCS ARDLIBS)
get_property(LIBRARY_SEARCH_PATH
DIRECTORY # Property Scope
PROPERTY LINK_DIRECTORIES)
foreach(LIB_SEARCH_PATH ${LIBRARY_SEARCH_PATH} ${ARDUINO_LIBRARIES_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libraries ${ARDUINO_EXTRA_LIBRARIES_PATH})
foreach(LIB_SEARCH_PATH ${LIBRARY_SEARCH_PATH} ${ARDUINO_LIBRARIES_PATH} ${${ARDUINO_PLATFORM}_LIBRARIES_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libraries ${ARDUINO_EXTRA_LIBRARIES_PATH})
if(EXISTS ${LIB_SEARCH_PATH}/${INCLUDE_NAME}/${CMAKE_MATCH_1})
list(APPEND ARDUINO_LIBS ${LIB_SEARCH_PATH}/${INCLUDE_NAME})
break()
endif()
if(EXISTS ${LIB_SEARCH_PATH}/${INCLUDE_NAME}/src/${CMAKE_MATCH_1})
list(APPEND ARDUINO_LIBS ${LIB_SEARCH_PATH}/${INCLUDE_NAME})
break()
endif()
if(EXISTS ${LIB_SEARCH_PATH}/${CMAKE_MATCH_1})
list(APPEND ARDUINO_LIBS ${LIB_SEARCH_PATH})
break()
Expand Down Expand Up @@ -962,6 +972,10 @@ endfunction()
set(Wire_RECURSE True)
set(Ethernet_RECURSE True)
set(SD_RECURSE True)
set(SPI_RECURSE True)
set(SoftwareSerial_RECURSE True)
set(EEPROM_RECURSE True)
set(LiquidCrystal_RECURSE True)
function(setup_arduino_library VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLAGS)
set(LIB_TARGETS)
set(LIB_INCLUDES)
Expand All @@ -978,7 +992,7 @@ function(setup_arduino_library VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLA

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

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

Expand All @@ -987,6 +1001,10 @@ function(setup_arduino_library VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLA
find_arduino_libraries(LIB_DEPS "${LIB_SRCS}" "")

foreach(LIB_DEP ${LIB_DEPS})
if(NOT DEP_LIB_SRCS STREQUAL TARGET_LIB_NAME AND DEP_LIB_SRCS)
message(STATUS "Found library ${LIB_NAME} needs ${DEP_LIB_SRCS}")
endif()

setup_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})
Expand All @@ -997,9 +1015,9 @@ function(setup_arduino_library VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLA
endif()

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

target_link_libraries(${TARGET_LIB_NAME} ${BOARD_ID}_CORE ${LIB_TARGETS})
list(APPEND LIB_TARGETS ${TARGET_LIB_NAME})
Expand Down Expand Up @@ -1079,6 +1097,8 @@ function(setup_arduino_target TARGET_NAME BOARD_ID ALL_SRCS ALL_LIBS COMPILE_FLA
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
endif()
set(TARGET_PATH ${EXECUTABLE_OUTPUT_PATH}/${TARGET_NAME})

message(STATUS "Using ${CMAKE_OBJCOPY} for converting firmware image to hex")
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_OBJCOPY}
ARGS ${ARDUINO_OBJCOPY_EEP_FLAGS}
Expand All @@ -1100,7 +1120,7 @@ function(setup_arduino_target TARGET_NAME BOARD_ID ALL_SRCS ALL_LIBS COMPILE_FLA
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -DFIRMWARE_IMAGE=${TARGET_PATH}.elf
-DMCU=${${BOARD_ID}.build.mcu}
-DMCU=${${BOARD_ID}${ARDUINO_CPUMENU}.build.mcu}
-DEEPROM_IMAGE=${TARGET_PATH}.eep
-P ${ARDUINO_SIZE_SCRIPT}
COMMENT "Calculating image size"
Expand All @@ -1110,7 +1130,7 @@ function(setup_arduino_target TARGET_NAME BOARD_ID ALL_SRCS ALL_LIBS COMPILE_FLA
add_custom_target(${TARGET_NAME}-size
COMMAND ${CMAKE_COMMAND}
-DFIRMWARE_IMAGE=${TARGET_PATH}.elf
-DMCU=${${BOARD_ID}.build.mcu}
-DMCU=${${BOARD_ID}${ARDUINO_CPUMENU}.build.mcu}
-DEEPROM_IMAGE=${TARGET_PATH}.eep
-P ${ARDUINO_SIZE_SCRIPT}
DEPENDS ${TARGET_NAME}
Expand Down Expand Up @@ -1265,8 +1285,8 @@ function(setup_arduino_bootloader_burn TARGET_NAME BOARD_ID PROGRAMMER PORT AVRD
endif()
endforeach()

if(NOT EXISTS "${ARDUINO_BOOTLOADERS_PATH}/${${BOARD_ID}.bootloader.path}/${${BOARD_ID}.bootloader.file}")
message("${ARDUINO_BOOTLOADERS_PATH}/${${BOARD_ID}.bootloader.path}/${${BOARD_ID}.bootloader.file}")
if(NOT EXISTS "${ARDUINO_BOOTLOADERS_PATH}/${${BOARD_ID}.bootloader.path}/${${BOARD_ID}${ARDUINO_CPUMENU}.bootloader.file}")
message("${ARDUINO_BOOTLOADERS_PATH}/${${BOARD_ID}.bootloader.path}/${${BOARD_ID}${ARDUINO_CPUMENU}.bootloader.file}")
message("Missing bootloader image, not creating bootloader burn target ${BOOTLOADER_TARGET}.")
return()
endif()
Expand All @@ -1277,14 +1297,14 @@ function(setup_arduino_bootloader_burn TARGET_NAME BOARD_ID PROGRAMMER PORT AVRD
# Set unlock bits and fuses (because chip is going to be erased)
list(APPEND AVRDUDE_ARGS "-Ulock:w:${${BOARD_ID}.bootloader.unlock_bits}:m")
if(${BOARD_ID}.bootloader.extended_fuses)
list(APPEND AVRDUDE_ARGS "-Uefuse:w:${${BOARD_ID}.bootloader.extended_fuses}:m")
list(APPEND AVRDUDE_ARGS "-Uefuse:w:${${BOARD_ID}${ARDUINO_CPUMENU}.bootloader.extended_fuses}:m")
endif()
list(APPEND AVRDUDE_ARGS
"-Uhfuse:w:${${BOARD_ID}.bootloader.high_fuses}:m"
"-Uhfuse:w:${${BOARD_ID}${ARDUINO_CPUMENU}.bootloader.high_fuses}:m"
"-Ulfuse:w:${${BOARD_ID}.bootloader.low_fuses}:m")

# Set bootloader image
list(APPEND AVRDUDE_ARGS "-Uflash:w:${${BOARD_ID}.bootloader.file}:i")
list(APPEND AVRDUDE_ARGS "-Uflash:w:${${BOARD_ID}${ARDUINO_CPUMENU}.bootloader.file}:i")

# Set lockbits
list(APPEND AVRDUDE_ARGS "-Ulock:w:${${BOARD_ID}.bootloader.lock_bits}:m")
Expand Down Expand Up @@ -1344,7 +1364,7 @@ function(setup_arduino_programmer_args BOARD_ID PROGRAMMER TARGET_NAME PORT AVRD
list(APPEND AVRDUDE_ARGS "-i${${PROGRAMMER}.delay}") # Set delay
endif()

list(APPEND AVRDUDE_ARGS "-p${${BOARD_ID}.build.mcu}") # MCU Type
list(APPEND AVRDUDE_ARGS "-p${${BOARD_ID}${ARDUINO_CPUMENU}.build.mcu}") # MCU Type

list(APPEND AVRDUDE_ARGS ${AVRDUDE_FLAGS})

Expand Down Expand Up @@ -1373,19 +1393,19 @@ function(setup_arduino_bootloader_args BOARD_ID TARGET_NAME PORT AVRDUDE_FLAGS O

list(APPEND AVRDUDE_ARGS
"-C${ARDUINO_AVRDUDE_CONFIG_PATH}" # avrdude config
"-p${${BOARD_ID}.build.mcu}" # MCU Type
"-p${${BOARD_ID}${ARDUINO_CPUMENU}.build.mcu}" # MCU Type
)

# Programmer
if(NOT ${BOARD_ID}.upload.protocol OR ${BOARD_ID}.upload.protocol STREQUAL "stk500")
if(NOT ${BOARD_ID}${ARDUINO_CPUMENU}.upload.protocol OR ${BOARD_ID}${ARDUINO_CPUMENU}.upload.protocol STREQUAL "stk500")
list(APPEND AVRDUDE_ARGS "-cstk500v1")
else()
list(APPEND AVRDUDE_ARGS "-c${${BOARD_ID}.upload.protocol}")
list(APPEND AVRDUDE_ARGS "-c${${BOARD_ID}${ARDUINO_CPUMENU}.upload.protocol}")
endif()

set(UPLOAD_SPEED "19200")
if(${BOARD_ID}.upload.speed)
set(UPLOAD_SPEED ${${BOARD_ID}.upload.speed})
if(${BOARD_ID}${ARDUINO_CPUMENU}.upload.speed)
set(UPLOAD_SPEED ${${BOARD_ID}${ARDUINO_CPUMENU}.upload.speed})
endif()

list(APPEND AVRDUDE_ARGS
Expand Down Expand Up @@ -1560,24 +1580,38 @@ function(LOAD_ARDUINO_STYLE_SETTINGS SETTINGS_LIST SETTINGS_PATH)
# 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)
list(GET ENTRY_NAME_TOKENS 1 ENTRY_SETTING)
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(PARAMETERS 2)
if(ENTRY_SETTING STREQUAL "menu")
list(GET ENTRY_NAME_TOKENS 3 CPUNAME)
if(ENTRY_NAME_TOKENS_LEN GREATER 4)
list(GET ENTRY_NAME_TOKENS 4 PROPERTYNAME)
set(ENTRY_SETTING "menu.cpu.${CPUNAME}.${PROPERTYNAME}")
set(PARAMETERS 5)
else()
set(ENTRY_SETTING "menu.cpu.${CPUNAME}")
set(PARAMETERS 4)
endif()
list(APPEND ${ENTRY_SETTING_LIST} "${ENTRY_SETTING}")
else()
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()
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)
if(ENTRY_NAME_TOKENS_LEN GREATER ${PARAMETERS})
set(ENTRY_SUBSETTING_LIST ${ENTRY_NAME}.${ENTRY_SETTING}.SUBSETTINGS)
list(GET ENTRY_NAME_TOKENS 2 ENTRY_SUBSETTING)
list(GET ENTRY_NAME_TOKENS ${PARAMETERS} ENTRY_SUBSETTING)
list(FIND ${ENTRY_SUBSETTING_LIST} ${ENTRY_SUBSETTING} ENTRY_SUBSETTING_INDEX)
if(ENTRY_SUBSETTING_INDEX LESS 0)
list(APPEND ${ENTRY_SUBSETTING_LIST} ${ENTRY_SUBSETTING})
Expand Down Expand Up @@ -1675,7 +1709,8 @@ function(SETUP_ARDUINO_EXAMPLE TARGET_NAME LIBRARY_NAME EXAMPLE_NAME OUTPUT_VAR)
get_property(LIBRARY_SEARCH_PATH
DIRECTORY # Property Scope
PROPERTY LINK_DIRECTORIES)
foreach(LIB_SEARCH_PATH ${LIBRARY_SEARCH_PATH} ${ARDUINO_LIBRARIES_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libraries)
foreach(LIB_SEARCH_PATH ${LIBRARY_SEARCH_PATH} ${ARDUINO_LIBRARIES_PATH} ${${ARDUINO_PLATFORM}_LIBRARIES_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libraries)
message(STATUS "Search ${LIBRARY_NAME} example directory in ${LIB_SEARCH_PATH}")
if(EXISTS "${LIB_SEARCH_PATH}/${LIBRARY_NAME}/examples/${EXAMPLE_NAME}")
set(EXAMPLE_SKETCH_PATH "${LIB_SEARCH_PATH}/${LIBRARY_NAME}/examples/${EXAMPLE_NAME}")
break()
Expand Down Expand Up @@ -2171,7 +2206,7 @@ if(NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH)
find_program(AVROBJCOPY_PROGRAM
avr-objcopy)
set(ADDITIONAL_REQUIRED_VARS AVROBJCOPY_PROGRAM)
set(CMAKE_OBJCOPY ${AVROBJCOPY_PROGRAM})
set(CMAKE_OBJCOPY ${AVROBJCOPY_PROGRAM} CACHE PATH "OBJCOPY Program for firmware convertion in hex")
endif(NOT CMAKE_OBJCOPY)

set(ARDUINO_DEFAULT_BOARD uno CACHE STRING "Default Arduino Board ID when not specified.")
Expand Down Expand Up @@ -2230,3 +2265,16 @@ if(NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH)
AVRSIZE_PROGRAM)
endif()

if(ARDUINO_SDK_VERSION VERSION_LESS 1.5)
set(ARDUINO_PLATFORM "AVR")
else()
if(NOT ARDUINO_PLATFORM)
register_hardware_platform(${ARDUINO_SDK_PATH}/hardware/arduino/avr)
set(ARDUINO_PLATFORM "AVR")
else()
string(TOLOWER ${ARDUINO_PLATFORM} _platform)
register_hardware_platform(${ARDUINO_SDK_PATH}/hardware/arduino/${_platform})
endif()
endif()