Major API improvements and changes, focusing on delivering a much better UX.
This version forms a basis for many other important features still missing from the framework.
- Every project now requires a call to a setup function named
arduino_cmake_project()
, which accepts the project's name and the hardware board associated with it (similar toboard_id
). - Derived from the above, there's no more need to pass a
board_id
argument to various API functions - They use the one passed to the setup function internally. - Platform libraries (SPI, Wire, etc.) can now be treated as all
Arduino libraries, i.e. found using
find_arduino_library
and then linked usinglink_arduino_library
.
Before that, a dedicated function namedlink_platform_library
had to be called.
Several bug-fixes discovered in the latest v0.6 and some minor features.
- Added ability to create Arduino libraries without specifying sources at the moment of creation.
It aligns well with CMake'starget_sources
API.
-
Fixed a potential regression bug on ubuntu/debian systems causing problems with the CoreLib creation.
-
Platform elements search has been updated to exclude system's PATH in order to avoid false path detection.
-
Fixed bug where platform libraries weren't using all of their sources.
This is a BIG version including numerous bug fixes, changes and even some new features.
It mostly addressed 3rd Party Libraries.
-
3rd Party Arduino libraries can now be manually added from any path using the
add_arduino_library
function or automatically found using thefind_arduino_library
function.
To use the find API, the3RD_PARTY
argument option should be passed to the function. -
Header-only Arduino libraries are now supported - They can be manually added using the
add_arduino_header_only_library
function or automatically found using thefind_arduino_library
function.
To use the find API, theHEADER_ONLY
argument option should be pass to the function. -
Full Arduino IDE Sketchbook support - Libraries, examples and sketches can be optionally searched there as well.
The framework can also automatically find the Sketchbook Location, however, this is disabled by default, what also means that unless set otherwise, the framework doesn't search the sketchbook - This policy is set due to the unwanted dependency on the Arduino IDE for this feature to fully work.
Further information can be found in the documentation. -
Many improvements to the CI platforms AppVeyor and Travis CI, including:
- Cached builds - Decreased build time significantly
- Improved control-flow and readability
- All functions that were expecting a theoretically "unlimited" list of sources to operate on, such as
add_arduino_executable
,add_arduino_library
etc. couldn't parse more than one file which also was the first. - The
Linux-Dist-Detection
module didn't check whether the required dependencies for the detection are installed. - 3rd Party libraries that don't include a library.properties file couldn't be used.
- 3rd Party libraries have been renamed to an "Arduino-Compliant" name when attempting to find them using the
find_arduino_library
function, which renamed them to an invalid name. - 3rd Party libraries that have been added using custom CMake logic (Calls to
add_library
) didn't get any of the build flags that every Arduino library has to have. - The framework couldn't automatically find the Arduino SDK on OS X images.
-
Updated project's workflow model, which mostly modifies the development branch from now on to be the master branch, instead of develop. More can be read in the CONTRIBUTING.md file.
-
The
Find-SDK
module now searches for the version.txt file under a sub-directory named lib, which resides directly under SDK's root path. This file's path is common across all OSs, unlike the previously searched arduino program. -
The
find_arduino_library
function now searches under the following paths:ARDUINO_SDK_LIBRARIES_PATH
- Usually the libraries directory under the SDK's root directory- Sketchbook Location - Arduino IDE's Sketchbook path, storing all user-downloaded libraries
CMAKE_CURRENT_SOURCE_DIRECTORY
- The directory in which the executed CMakeLists.txt file resides, i.e. Project's source directoryPROJECT_SOURCE_DIR
- The directory in which the CMakeLists.txt file that sets theproject
resides.
Besides, the following sub-directories are searched under every path mentioned above:
- libraries
- dependencies
-
3rd Party Arduino Libraries do not longer have to include the library.properties file in their root directory - Their root directory is searched instead.
Nevertheless including the file is still recommended, because when the file isn't present, the framework can't infer potentially required metadata from it.
This version adds case-insensitive support for examples, forgotten in the last version.
Fixes a bug in Core-Lib target creation on Debian/Ubuntu systems, and adds support for AppVeyor CI.
But most importantly - It changes the way users should supply a custom SDK location.
- Example name parameter of the Example API functions is now case-insensitive
- Support for AppVeyor continuous integration/CI.
- Supplying custom Arduino SDK path - Should now set an environment variable in the system named
ARDUINO_SDK_PATH
, instead of passing it as a variable to CMake through-D
- Parameter order in the
add_arduino_library_example
function -_board_id
becomes 2nd
- Potential bug in Debian/Ubuntu systems when creating Core Library targets
This version fixes some "invisible" bugs from previous versions, along with general design improvements.
Moreover, there are even some new minor features.
- Library name parameter of the
find_arduino_library
function is now case-insensitive due to a new utility feature to convert strings to PascalCase
- Refactored many modules previously under the
Other
directory to be each under its' relevant directory
- Sketch conversion was only partially avoided - Now the functionality is optimized
- Arduino libraries couldn't be linked to the target when resolving a sketch's headers
- Regex search patterns
This version refactored the Sketch API entirely to enhance support for missing features from previous versions. It also organized "globals" and default options in a single 'Defaults' module.
- Headers included in a sketch file are now resolved to provide better insight
- Arduino/Platform libraries that are resolved from a sketch's headers are linked to the target
- Option/Policy to "forcefully" convert a sketch to a source file when adding it to a target, even if the source file already exists (Usually means that sketch has already been converted).
By default it's set to OFF.
- New Sketch API which resembles CMake's target API - Use
target_sketches
as you would usetarget_sources
- Various inline search patterns and defaults have been moved to the 'DefaultsManager' module
This version adds minor feature improvements as well as complete sketch support.
- Full sketch support in the API
- Sketch targets can be created by calling the
add_sketch_target
function
- Sketch targets can be created by calling the
- Ability to provide a custom main platform header by setting the
USE_CUSTOM_PLATFORM_HEADER
option on
This version mostly added support for examples and sketches.
- Arduino examples such as Blink can now be used by calling the
add_arduino_example
function - Arduino library examples, each being part of an Arduino library, can also be used by calling the
add_arduino_library_example
function - Arduino Sketches can be converted into source files under the project's source directory.
The API to use them seamlessly as using examples is still missing, however. - During platform initialization the main header of the platform gets selected.
This is useful for sketch conversion, as sketches usually don't include the header in their source files but depend on the Arduino IDE to do so instead.
The header is selected based on the number of#include
lines it has - The header with most includes is selected as platform's main header, as it probably includes many other platform headers.
- The API of the utility function
list_replace
now resembles CMake's List API.
It's also a macro now instead of a function. - Improved logic and performance of utility
increment
anddecrement
math functions
This version includes a critical bug fix.
- Wrong Core Library was used for libraries of the same board - As the Core-Lib is board-specific and board-dependent, it shouldn't be different for targets of the same board
This version added support for Arduino libraries and platform libraries.
- Arduino libraries can be found by calling
find_arduino_library
and then linked to another target by callinglink_arduino_library
- The library search process is architecture-aware, meaning that only sources that match the platform's architecture will be included in the library target
- Arduino platform libraries can be simply linked to another target by calling
link_platform_library
.
There's no special search process for platform libraries as there is for Arduino libraries.
This version added support for the Core Library - A static library built from the platform's core sources that must be linked to every single target in the Arduino build system, including libraries in the future.
This library is also the missing piece for getting correct program sizes, which hasn't been the case up until now.
- The Core Library is added once per board (As a board has a single associated core) and linked against every created target.
This behavior is internal and not up to the control of the user, much like a Kernel.
- The entire codebase has been "cleaned", code-wise. It includes:
- Separation of Concerns - Everything has its' own function, preferably also a module (CMake file)
- Better control flow
- Better use of "Modern CMake" recommendations
This version added support for displaying a program's size upon build completion.
- Program size output for every executable target at the end of each successful build.
This is done using Arduino's avr-size tool.
The tool's output is then reformatted to match the format of Arduino IDE.
This is the bare metal version of the framework, adding support for the very basic stuff.
Although basic, there's a lot that had to be done in order to reach a somewhat "stable" version that can be burned to the board and actually work.
- Creating Arduino "executables" (Hex files that can be burned/uploaded/flashed to the hardware board) by calling
add_arduino_executable
- Uploading created executables/targets to a connected hardware board by calling
upload_arduino_target
, passing it the Serial Port (Such as COM3) through which the uploading process will be done - Analyzing the SDK by parsing all required information from files such as
platform.txt
andboards.txt
- Parsing the
platform.txt
file is an entirely new concept that hasn't been used until now in all forks of the old Arduino-CMake. In fact, this is what allows the framework to be truly platform-agnostic, as it defines the platform's core behavior
- Parsing the
Many more subtle and internal features have been implemented, but they won't be listed here.