arduino_sketch_builder 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.gitmodules +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +71 -0
- data/Rakefile +5 -0
- data/arduino-cmake/cmake/ArduinoToolchain.cmake +75 -0
- data/arduino-cmake/cmake/Platform/Arduino.cmake +1846 -0
- data/arduino_sketch_builder.gemspec +22 -0
- data/lib/arduino_sketch_builder.rb +8 -0
- data/lib/arduino_sketch_builder/arduino_cmake_build.rb +52 -0
- data/lib/arduino_sketch_builder/c_make_lists_file_generator.rb +34 -0
- data/lib/arduino_sketch_builder/setup.rb +46 -0
- data/lib/arduino_sketch_builder/version.rb +3 -0
- data/lib/arduino_sketches/CMakeLists.txt +20 -0
- data/lib/arduino_sketches/src/BlinkCustomized/BlinkCustomized.ino +19 -0
- data/lib/arduino_sketches/src/CMakeLists.txt +14 -0
- data/spec/arduino_sketch_builder/arduino_cmake_build_spec.rb +105 -0
- data/spec/arduino_sketch_builder/c_make_lists_file_generator_spec.rb +35 -0
- data/spec/arduino_sketch_builder/setup_spec.rb +86 -0
- data/spec/arduino_sketches_fixture/CMakeLists.txt +20 -0
- data/spec/arduino_sketches_fixture/build/.gitkeep +0 -0
- data/spec/arduino_sketches_fixture/src/BlinkCustomizedForTest/BlinkCustomizedForTest.ino +19 -0
- data/spec/arduino_sketches_fixture/src/CMakeLists.txt +16 -0
- data/spec/fixtures/CMakeListsForTestSketch.txt +10 -0
- data/spec/fixtures/MainCMakeLists.txt +22 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/temp/blink_customized_for_test/src/BlinkCustomizedForTest/BlinkCustomizedForTest.ino +19 -0
- data/spec/temp/blink_customized_for_test/src/CMakeLists.txt +10 -0
- data/templates/MainCMakeListsTemplate.txt.erb +22 -0
- data/templates/SourceCMakeListsTemplate.txt.erb +10 -0
- data/templates/gitkeep_template +0 -0
- data/templates/root_gitignore_template +2 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e29a1ee1ac0e35fdbb247b9acd642b26cfaf8db6
|
4
|
+
data.tar.gz: 838d0585f920ca96720d2b42dab900e1d794c116
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a64eb3e51947d7cf7327e961590fd1d95517531cab86e2cd7e41c46f980ff1e0d9f46260cd5d47f43e2796bde97946c557239a54f5af5ba8a57f699e31bd732e
|
7
|
+
data.tar.gz: 6a2771b672a28add2eef4db65546755bf8779066822f809f45a462ddabcfb2665619aa0aa0b2c28aa3334a62bfe39dc5f3b2ba001cb29bc1cc830906e8d77fcc
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
.rvmrc
|
19
|
+
.rspec
|
20
|
+
lib/arduino_sketches/build
|
21
|
+
spec/arduino_sketches_fixture/build/**/*.*
|
22
|
+
spec/temp/**/*.*
|
23
|
+
spec/temp/.*
|
data/.gitmodules
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Tadatoshi Takahashi
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# ArduinoSketchBuilder
|
2
|
+
|
3
|
+
Performs calling the code to compile Arduino sketch and upload it to Arduino
|
4
|
+
by Ruby, instead of using Arduino IDE.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'arduino_sketch_builder'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install arduino_sketch_builder
|
19
|
+
|
20
|
+
## Requirements
|
21
|
+
|
22
|
+
Works with Ruby 1.9.3 and Ruby 2.0.0 (Tested with them).
|
23
|
+
|
24
|
+
Arduino SDK version 0.19 or higher.
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
### Arduino CMake
|
29
|
+
|
30
|
+
This gem uses the code from **Arduino CMake** (https://github.com/queezythegreat/arduino-cmake).
|
31
|
+
Originally, **Arduino CMake** was included as GIT submodule in this gem.
|
32
|
+
But there was a problem so now the necessary **Arduino CMake** codes are copied in this gem (arduino-cmake directory).
|
33
|
+
|
34
|
+
### Directory structure
|
35
|
+
|
36
|
+
The default directory structure is
|
37
|
+
The default directory structure is
|
38
|
+
(root directory)
|
39
|
+
|- cmake
|
40
|
+
| |- ArduinoToolchain.cmake
|
41
|
+
| |- Platform
|
42
|
+
| |- Arduino.cmake
|
43
|
+
|- (name of Arduino sketch underlined)
|
44
|
+
|--build
|
45
|
+
|--src
|
46
|
+
| |--(name of Arduino sketch)
|
47
|
+
| |--(Arduino sketch file)
|
48
|
+
| |--CMakeLists.txt
|
49
|
+
|--CMakeLists.txt
|
50
|
+
|
51
|
+
example:
|
52
|
+
~/.arduino_sketches
|
53
|
+
|- cmake
|
54
|
+
| |- ArduinoToolchain.cmake
|
55
|
+
| |- Platform
|
56
|
+
| |- Arduino.cmake
|
57
|
+
|- blink_customized
|
58
|
+
|--build
|
59
|
+
|--src
|
60
|
+
| |--BlinkCustomized
|
61
|
+
| |--BlinkCustomized.ino
|
62
|
+
| |--CMakeLists.txt
|
63
|
+
|--CMakeLists.txt
|
64
|
+
|
65
|
+
## Contributing
|
66
|
+
|
67
|
+
1. Fork it
|
68
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
69
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
70
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
71
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#=============================================================================#
|
2
|
+
# Author: Tomasz Bogdal (QueezyTheGreat)
|
3
|
+
# Home: https://github.com/queezythegreat/arduino-cmake
|
4
|
+
#
|
5
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
6
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
7
|
+
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
8
|
+
#=============================================================================#
|
9
|
+
set(CMAKE_SYSTEM_NAME Arduino)
|
10
|
+
|
11
|
+
set(CMAKE_C_COMPILER avr-gcc)
|
12
|
+
set(CMAKE_CXX_COMPILER avr-g++)
|
13
|
+
|
14
|
+
# Add current directory to CMake Module path automatically
|
15
|
+
if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/Platform/Arduino.cmake)
|
16
|
+
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR})
|
17
|
+
endif()
|
18
|
+
|
19
|
+
#=============================================================================#
|
20
|
+
# System Paths #
|
21
|
+
#=============================================================================#
|
22
|
+
if(UNIX)
|
23
|
+
include(Platform/UnixPaths)
|
24
|
+
if(APPLE)
|
25
|
+
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ~/Applications
|
26
|
+
/Applications
|
27
|
+
/Developer/Applications
|
28
|
+
/sw # Fink
|
29
|
+
/opt/local) # MacPorts
|
30
|
+
endif()
|
31
|
+
elseif(WIN32)
|
32
|
+
include(Platform/WindowsPaths)
|
33
|
+
endif()
|
34
|
+
|
35
|
+
|
36
|
+
#=============================================================================#
|
37
|
+
# Detect Arduino SDK #
|
38
|
+
#=============================================================================#
|
39
|
+
if(NOT ARDUINO_SDK_PATH)
|
40
|
+
set(ARDUINO_PATHS)
|
41
|
+
|
42
|
+
foreach(DETECT_VERSION_MAJOR 1)
|
43
|
+
foreach(DETECT_VERSION_MINOR RANGE 5 0)
|
44
|
+
list(APPEND ARDUINO_PATHS arduino-${DETECT_VERSION_MAJOR}.${DETECT_VERSION_MINOR})
|
45
|
+
foreach(DETECT_VERSION_PATCH RANGE 3 0)
|
46
|
+
list(APPEND ARDUINO_PATHS arduino-${DETECT_VERSION_MAJOR}.${DETECT_VERSION_MINOR}.${DETECT_VERSION_PATCH})
|
47
|
+
endforeach()
|
48
|
+
endforeach()
|
49
|
+
endforeach()
|
50
|
+
|
51
|
+
foreach(VERSION RANGE 23 19)
|
52
|
+
list(APPEND ARDUINO_PATHS arduino-00${VERSION})
|
53
|
+
endforeach()
|
54
|
+
|
55
|
+
file(GLOB SDK_PATH_HINTS /usr/share/arduino*
|
56
|
+
/opt/local/ardiuno*
|
57
|
+
/usr/local/share/arduino*)
|
58
|
+
list(SORT SDK_PATH_HINTS)
|
59
|
+
list(REVERSE SDK_PATH_HINTS)
|
60
|
+
endif()
|
61
|
+
|
62
|
+
find_path(ARDUINO_SDK_PATH
|
63
|
+
NAMES lib/version.txt
|
64
|
+
PATH_SUFFIXES share/arduino
|
65
|
+
Arduino.app/Contents/Resources/Java/
|
66
|
+
${ARDUINO_PATHS}
|
67
|
+
HINTS ${SDK_PATH_HINTS}
|
68
|
+
DOC "Arduino SDK path.")
|
69
|
+
|
70
|
+
if(ARDUINO_SDK_PATH)
|
71
|
+
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${ARDUINO_SDK_PATH}/hardware/tools/avr/bin)
|
72
|
+
list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${ARDUINO_SDK_PATH}/hardware/tools/avr/utils/bin)
|
73
|
+
else()
|
74
|
+
message(FATAL_ERROR "Could not find Arduino SDK (set ARDUINO_SDK_PATH)!")
|
75
|
+
endif()
|
@@ -0,0 +1,1846 @@
|
|
1
|
+
#=============================================================================#
|
2
|
+
# generate_arduino_firmware(name
|
3
|
+
# [BOARD board_id]
|
4
|
+
# [SKETCH sketch_path |
|
5
|
+
# SRCS src1 src2 ... srcN]
|
6
|
+
# [HDRS hdr1 hdr2 ... hdrN]
|
7
|
+
# [LIBS lib1 lib2 ... libN]
|
8
|
+
# [PORT port]
|
9
|
+
# [SERIAL serial_cmd]
|
10
|
+
# [PROGRAMMER programmer_id]
|
11
|
+
# [AFLAGS flags]
|
12
|
+
# [NO_AUTOLIBS]
|
13
|
+
# [MANUAL])
|
14
|
+
#=============================================================================#
|
15
|
+
#
|
16
|
+
# generaters firmware and libraries for Arduino devices
|
17
|
+
#
|
18
|
+
# The arguments are as follows:
|
19
|
+
#
|
20
|
+
# name # The name of the firmware target [REQUIRED]
|
21
|
+
# BOARD # Board name (such as uno, mega2560, ...) [REQUIRED]
|
22
|
+
# SKETCH # Arduino sketch [must have SRCS or SKETCH]
|
23
|
+
# SRCS # Sources [must have SRCS or SKETCH]
|
24
|
+
# HDRS # Headers
|
25
|
+
# LIBS # Libraries to link
|
26
|
+
# PORT # Serial port (enables upload support)
|
27
|
+
# SERIAL # Serial command for serial target
|
28
|
+
# PROGRAMMER # Programmer id (enables programmer support)
|
29
|
+
# AFLAGS # Avrdude flags for target
|
30
|
+
# NO_AUTOLIBS # Disables Arduino library detection
|
31
|
+
# MANUAL # (Advanced) Only use AVR Libc/Includes
|
32
|
+
#
|
33
|
+
# Here is a short example for a target named test:
|
34
|
+
#
|
35
|
+
# generate_arduino_firmware(
|
36
|
+
# NAME test
|
37
|
+
# SRCS test.cpp
|
38
|
+
# test2.cpp
|
39
|
+
# HDRS test.h test2.h
|
40
|
+
# BOARD uno)
|
41
|
+
#
|
42
|
+
# Alternatively you can specify the option by variables:
|
43
|
+
#
|
44
|
+
# set(test_SRCS test.cpp test2.cpp)
|
45
|
+
# set(test_HDRS test.h test2.h
|
46
|
+
# set(test_BOARD uno)
|
47
|
+
#
|
48
|
+
# generate_arduino_firmware(test)
|
49
|
+
#
|
50
|
+
# All variables need to be prefixed with the target name (${TARGET_NAME}_${OPTION}).
|
51
|
+
#
|
52
|
+
#=============================================================================#
|
53
|
+
# generate_arduino_library(name
|
54
|
+
# [BOARD board_id]
|
55
|
+
# [SRCS src1 src2 ... srcN]
|
56
|
+
# [HDRS hdr1 hdr2 ... hdrN]
|
57
|
+
# [LIBS lib1 lib2 ... libN]
|
58
|
+
# [NO_AUTOLIBS])
|
59
|
+
#=============================================================================#
|
60
|
+
# generaters firmware and libraries for Arduino devices
|
61
|
+
#
|
62
|
+
# The arguments are as follows:
|
63
|
+
#
|
64
|
+
# name # The name of the firmware target [REQUIRED]
|
65
|
+
# BOARD # Board name (such as uno, mega2560, ...) [REQUIRED]
|
66
|
+
# SRCS # Sources [REQUIRED]
|
67
|
+
# HDRS # Headers
|
68
|
+
# LIBS # Libraries to link
|
69
|
+
# NO_AUTOLIBS # Disables Arduino library detection
|
70
|
+
#
|
71
|
+
# Here is a short example for a target named test:
|
72
|
+
#
|
73
|
+
# generate_arduino_library(
|
74
|
+
# NAME test
|
75
|
+
# SRCS test.cpp
|
76
|
+
# test2.cpp
|
77
|
+
# HDRS test.h test2.h
|
78
|
+
# BOARD uno)
|
79
|
+
#
|
80
|
+
# Alternatively you can specify the option by variables:
|
81
|
+
#
|
82
|
+
# set(test_SRCS test.cpp test2.cpp)
|
83
|
+
# set(test_HDRS test.h test2.h
|
84
|
+
# set(test_BOARD uno)
|
85
|
+
#
|
86
|
+
# generate_arduino_library(test)
|
87
|
+
#
|
88
|
+
# All variables need to be prefixed with the target name (${TARGET_NAME}_${OPTION}).
|
89
|
+
#
|
90
|
+
#=============================================================================#
|
91
|
+
# generate_arduino_example(name
|
92
|
+
# LIBRARY library_name
|
93
|
+
# EXAMPLE example_name
|
94
|
+
# [BOARD board_id]
|
95
|
+
# [PORT port]
|
96
|
+
# [SERIAL serial command]
|
97
|
+
# [PORGRAMMER programmer_id]
|
98
|
+
# [AFLAGS avrdude_flags])
|
99
|
+
#=============================================================================#
|
100
|
+
#
|
101
|
+
# name - The name of the library example [REQUIRED]
|
102
|
+
# LIBRARY - Library name [REQUIRED]
|
103
|
+
# EXAMPLE - Example name [REQUIRED]
|
104
|
+
# BOARD - Board ID
|
105
|
+
# PORT - Serial port [optional]
|
106
|
+
# SERIAL - Serial command [optional]
|
107
|
+
# PROGRAMMER - Programmer id (enables programmer support)
|
108
|
+
# AFLAGS - Avrdude flags for target
|
109
|
+
#
|
110
|
+
# Creates a example from the specified library.
|
111
|
+
#
|
112
|
+
#
|
113
|
+
#=============================================================================#
|
114
|
+
# print_board_list()
|
115
|
+
#=============================================================================#
|
116
|
+
#
|
117
|
+
# Print list of detected Arduino Boards.
|
118
|
+
#
|
119
|
+
#=============================================================================#
|
120
|
+
# print_programmer_list()
|
121
|
+
#=============================================================================#
|
122
|
+
#
|
123
|
+
# Print list of detected Programmers.
|
124
|
+
#
|
125
|
+
#=============================================================================#
|
126
|
+
# print_programmer_settings(PROGRAMMER)
|
127
|
+
#=============================================================================#
|
128
|
+
#
|
129
|
+
# PROGRAMMER - programmer id
|
130
|
+
#
|
131
|
+
# Print the detected Programmer settings.
|
132
|
+
#
|
133
|
+
#=============================================================================#
|
134
|
+
# print_board_settings(ARDUINO_BOARD)
|
135
|
+
#=============================================================================#
|
136
|
+
#
|
137
|
+
# ARDUINO_BOARD - Board id
|
138
|
+
#
|
139
|
+
# Print the detected Arduino board settings.
|
140
|
+
#
|
141
|
+
#=============================================================================#
|
142
|
+
# Configuration Options
|
143
|
+
#=============================================================================#
|
144
|
+
#
|
145
|
+
# ARDUINO_SDK_PATH - Arduino SDK Path
|
146
|
+
# ARDUINO_AVRDUDE_PROGRAM - Full path to avrdude programmer
|
147
|
+
# ARDUINO_AVRDUDE_CONFIG_PATH - Full path to avrdude configuration file
|
148
|
+
#
|
149
|
+
# ARDUINO_C_FLAGS - C compiler flags
|
150
|
+
# ARDUINO_CXX_FLAGS - C++ compiler flags
|
151
|
+
# ARDUINO_LINKER_FLAGS - Linker flags
|
152
|
+
#
|
153
|
+
# ARDUINO_DEFAULT_BOARD - Default Arduino Board ID when not specified.
|
154
|
+
# ARDUINO_DEFAULT_PORT - Default Arduino port when not specified.
|
155
|
+
# ARDUINO_DEFAULT_SERIAL - Default Arduino Serial command when not specified.
|
156
|
+
# ARDUINO_DEFAULT_PROGRAMMER - Default Arduino Programmer ID when not specified.
|
157
|
+
#
|
158
|
+
#
|
159
|
+
# ARDUINO_FOUND - Set to True when the Arduino SDK is detected and configured.
|
160
|
+
# ARDUINO_SDK_VERSION - Set to the version of the detected Arduino SDK (ex: 1.0)
|
161
|
+
|
162
|
+
#=============================================================================#
|
163
|
+
# Author: Tomasz Bogdal (QueezyTheGreat)
|
164
|
+
# Home: https://github.com/queezythegreat/arduino-cmake
|
165
|
+
#
|
166
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
167
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
168
|
+
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
169
|
+
#=============================================================================#
|
170
|
+
cmake_minimum_required(VERSION 2.8.5)
|
171
|
+
include(CMakeParseArguments)
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
|
178
|
+
#=============================================================================#
|
179
|
+
# User Functions
|
180
|
+
#=============================================================================#
|
181
|
+
|
182
|
+
#=============================================================================#
|
183
|
+
# [PUBLIC/USER]
|
184
|
+
#
|
185
|
+
# print_board_list()
|
186
|
+
#
|
187
|
+
# see documentation at top
|
188
|
+
#=============================================================================#
|
189
|
+
function(PRINT_BOARD_LIST)
|
190
|
+
message(STATUS "Arduino Boards:")
|
191
|
+
print_list(ARDUINO_BOARDS)
|
192
|
+
message(STATUS "")
|
193
|
+
endfunction()
|
194
|
+
|
195
|
+
#=============================================================================#
|
196
|
+
# [PUBLIC/USER]
|
197
|
+
#
|
198
|
+
# print_programmer_list()
|
199
|
+
#
|
200
|
+
# see documentation at top
|
201
|
+
#=============================================================================#
|
202
|
+
function(PRINT_PROGRAMMER_LIST)
|
203
|
+
message(STATUS "Arduino Programmers:")
|
204
|
+
print_list(ARDUINO_PROGRAMMERS)
|
205
|
+
message(STATUS "")
|
206
|
+
endfunction()
|
207
|
+
|
208
|
+
#=============================================================================#
|
209
|
+
# [PUBLIC/USER]
|
210
|
+
#
|
211
|
+
# print_programmer_settings(PROGRAMMER)
|
212
|
+
#
|
213
|
+
# see documentation at top
|
214
|
+
#=============================================================================#
|
215
|
+
function(PRINT_PROGRAMMER_SETTINGS PROGRAMMER)
|
216
|
+
if(${PROGRAMMER}.SETTINGS)
|
217
|
+
message(STATUS "Programmer ${PROGRAMMER} Settings:")
|
218
|
+
print_settings(${PROGRAMMER})
|
219
|
+
endif()
|
220
|
+
endfunction()
|
221
|
+
|
222
|
+
# [PUBLIC/USER]
|
223
|
+
#
|
224
|
+
# print_board_settings(ARDUINO_BOARD)
|
225
|
+
#
|
226
|
+
# see documentation at top
|
227
|
+
function(PRINT_BOARD_SETTINGS ARDUINO_BOARD)
|
228
|
+
if(${ARDUINO_BOARD}.SETTINGS)
|
229
|
+
message(STATUS "Arduino ${ARDUINO_BOARD} Board:")
|
230
|
+
print_settings(${ARDUINO_BOARD})
|
231
|
+
endif()
|
232
|
+
endfunction()
|
233
|
+
|
234
|
+
#=============================================================================#
|
235
|
+
# [PUBLIC/USER]
|
236
|
+
# see documentation at top
|
237
|
+
#=============================================================================#
|
238
|
+
function(GENERATE_ARDUINO_LIBRARY INPUT_NAME)
|
239
|
+
message(STATUS "Generating ${INPUT_NAME}")
|
240
|
+
parse_generator_arguments(${INPUT_NAME} INPUT
|
241
|
+
"NO_AUTOLIBS;MANUAL" # Options
|
242
|
+
"BOARD" # One Value Keywords
|
243
|
+
"SRCS;HDRS;LIBS" # Multi Value Keywords
|
244
|
+
${ARGN})
|
245
|
+
|
246
|
+
if(NOT INPUT_BOARD)
|
247
|
+
set(INPUT_BOARD ${ARDUINO_DEFAULT_BOARD})
|
248
|
+
endif()
|
249
|
+
if(NOT INPUT_MANUAL)
|
250
|
+
set(INPUT_MANUAL FALSE)
|
251
|
+
endif()
|
252
|
+
required_variables(VARS INPUT_SRCS INPUT_BOARD MSG "must define for target ${INPUT_NAME}")
|
253
|
+
|
254
|
+
set(ALL_LIBS)
|
255
|
+
set(ALL_SRCS ${INPUT_SRCS} ${INPUT_HDRS})
|
256
|
+
|
257
|
+
if(NOT INPUT_MANUAL)
|
258
|
+
setup_arduino_core(CORE_LIB ${INPUT_BOARD})
|
259
|
+
endif()
|
260
|
+
|
261
|
+
find_arduino_libraries(TARGET_LIBS "${ALL_SRCS}")
|
262
|
+
set(LIB_DEP_INCLUDES)
|
263
|
+
foreach(LIB_DEP ${TARGET_LIBS})
|
264
|
+
set(LIB_DEP_INCLUDES "${LIB_DEP_INCLUDES} -I\"${LIB_DEP}\"")
|
265
|
+
endforeach()
|
266
|
+
|
267
|
+
if(NOT ${INPUT_NO_AUTOLIBS})
|
268
|
+
setup_arduino_libraries(ALL_LIBS ${INPUT_BOARD} "${ALL_SRCS}" "${LIB_DEP_INCLUDES}" "")
|
269
|
+
endif()
|
270
|
+
|
271
|
+
list(APPEND ALL_LIBS ${CORE_LIB} ${INPUT_LIBS})
|
272
|
+
|
273
|
+
add_library(${INPUT_NAME} ${ALL_SRCS})
|
274
|
+
|
275
|
+
get_arduino_flags(ARDUINO_COMPILE_FLAGS ARDUINO_LINK_FLAGS ${INPUT_BOARD} ${INPUT_MANUAL})
|
276
|
+
|
277
|
+
set_target_properties(${INPUT_NAME} PROPERTIES
|
278
|
+
COMPILE_FLAGS "${ARDUINO_COMPILE_FLAGS} ${COMPILE_FLAGS} ${LIB_DEP_INCLUDES}"
|
279
|
+
LINK_FLAGS "${ARDUINO_LINK_FLAGS} ${LINK_FLAGS}")
|
280
|
+
|
281
|
+
target_link_libraries(${INPUT_NAME} ${ALL_LIBS} "-lc -lm")
|
282
|
+
endfunction()
|
283
|
+
|
284
|
+
#=============================================================================#
|
285
|
+
# [PUBLIC/USER]
|
286
|
+
# see documentation at top
|
287
|
+
#=============================================================================#
|
288
|
+
function(GENERATE_ARDUINO_FIRMWARE INPUT_NAME)
|
289
|
+
message(STATUS "Generating ${INPUT_NAME}")
|
290
|
+
parse_generator_arguments(${INPUT_NAME} INPUT
|
291
|
+
"NO_AUTOLIBS;MANUAL" # Options
|
292
|
+
"BOARD;PORT;SKETCH;PROGRAMMER" # One Value Keywords
|
293
|
+
"SERIAL;SRCS;HDRS;LIBS;AFLAGS" # Multi Value Keywords
|
294
|
+
${ARGN})
|
295
|
+
|
296
|
+
if(NOT INPUT_BOARD)
|
297
|
+
set(INPUT_BOARD ${ARDUINO_DEFAULT_BOARD})
|
298
|
+
endif()
|
299
|
+
if(NOT INPUT_PORT)
|
300
|
+
set(INPUT_PORT ${ARDUINO_DEFAULT_PORT})
|
301
|
+
endif()
|
302
|
+
if(NOT INPUT_SERIAL)
|
303
|
+
set(INPUT_SERIAL ${ARDUINO_DEFAULT_SERIAL})
|
304
|
+
endif()
|
305
|
+
if(NOT INPUT_PROGRAMMER)
|
306
|
+
set(INPUT_PROGRAMMER ${ARDUINO_DEFAULT_PROGRAMMER})
|
307
|
+
endif()
|
308
|
+
if(NOT INPUT_MANUAL)
|
309
|
+
set(INPUT_MANUAL FALSE)
|
310
|
+
endif()
|
311
|
+
required_variables(VARS INPUT_BOARD MSG "must define for target ${INPUT_NAME}")
|
312
|
+
|
313
|
+
set(ALL_LIBS)
|
314
|
+
set(ALL_SRCS ${INPUT_SRCS} ${INPUT_HDRS})
|
315
|
+
set(LIB_DEP_INCLUDES)
|
316
|
+
|
317
|
+
if(NOT INPUT_MANUAL)
|
318
|
+
setup_arduino_core(CORE_LIB ${INPUT_BOARD})
|
319
|
+
endif()
|
320
|
+
|
321
|
+
if(NOT "${INPUT_SKETCH}" STREQUAL "")
|
322
|
+
get_filename_component(INPUT_SKETCH "${INPUT_SKETCH}" ABSOLUTE)
|
323
|
+
setup_arduino_sketch(${INPUT_NAME} ${INPUT_SKETCH} ALL_SRCS)
|
324
|
+
if (IS_DIRECTORY "${INPUT_SKETCH}")
|
325
|
+
set(LIB_DEP_INCLUDES "${LIB_DEP_INCLUDES} -I\"${INPUT_SKETCH}\"")
|
326
|
+
else()
|
327
|
+
get_filename_component(INPUT_SKETCH_PATH "${INPUT_SKETCH}" PATH)
|
328
|
+
set(LIB_DEP_INCLUDES "${LIB_DEP_INCLUDES} -I\"${INPUT_SKETCH_PATH}\"")
|
329
|
+
endif()
|
330
|
+
endif()
|
331
|
+
|
332
|
+
required_variables(VARS ALL_SRCS MSG "must define SRCS or SKETCH for target ${INPUT_NAME}")
|
333
|
+
|
334
|
+
find_arduino_libraries(TARGET_LIBS "${ALL_SRCS}")
|
335
|
+
foreach(LIB_DEP ${TARGET_LIBS})
|
336
|
+
set(LIB_DEP_INCLUDES "${LIB_DEP_INCLUDES} -I\"${LIB_DEP}\"")
|
337
|
+
endforeach()
|
338
|
+
|
339
|
+
if(NOT INPUT_NO_AUTOLIBS)
|
340
|
+
setup_arduino_libraries(ALL_LIBS ${INPUT_BOARD} "${ALL_SRCS}" "${LIB_DEP_INCLUDES}" "")
|
341
|
+
endif()
|
342
|
+
|
343
|
+
list(APPEND ALL_LIBS ${CORE_LIB} ${INPUT_LIBS})
|
344
|
+
|
345
|
+
setup_arduino_target(${INPUT_NAME} ${INPUT_BOARD} "${ALL_SRCS}" "${ALL_LIBS}" "${LIB_DEP_INCLUDES}" "" "${INPUT_MANUAL}")
|
346
|
+
|
347
|
+
if(INPUT_PORT)
|
348
|
+
setup_arduino_upload(${INPUT_BOARD} ${INPUT_NAME} ${INPUT_PORT} "${INPUT_PROGRAMMER}" "${INPUT_AFLAGS}")
|
349
|
+
endif()
|
350
|
+
|
351
|
+
if(INPUT_SERIAL)
|
352
|
+
setup_serial_target(${INPUT_NAME} "${INPUT_SERIAL}" "${INPUT_PORT}")
|
353
|
+
endif()
|
354
|
+
|
355
|
+
endfunction()
|
356
|
+
|
357
|
+
#=============================================================================#
|
358
|
+
# [PUBLIC/USER]
|
359
|
+
# see documentation at top
|
360
|
+
#=============================================================================#
|
361
|
+
function(GENERATE_ARDUINO_EXAMPLE INPUT_NAME)
|
362
|
+
message(STATUS "Generating example ${LIBRARY_NAME}-${EXAMPLE_NAME}")
|
363
|
+
parse_generator_arguments(${INPUT_NAME} INPUT
|
364
|
+
"" # Options
|
365
|
+
"LIBRARY;EXAMPLE;BOARD;PORT;PROGRAMMER" # One Value Keywords
|
366
|
+
"SERIAL;AFLAGS" # Multi Value Keywords
|
367
|
+
${ARGN})
|
368
|
+
|
369
|
+
if(NOT INPUT_BOARD)
|
370
|
+
set(INPUT_BOARD ${ARDUINO_DEFAULT_BOARD})
|
371
|
+
endif()
|
372
|
+
if(NOT INPUT_PORT)
|
373
|
+
set(INPUT_PORT ${ARDUINO_DEFAULT_PORT})
|
374
|
+
endif()
|
375
|
+
if(NOT INPUT_SERIAL)
|
376
|
+
set(INPUT_SERIAL ${ARDUINO_DEFAULT_SERIAL})
|
377
|
+
endif()
|
378
|
+
if(NOT INPUT_PROGRAMMER)
|
379
|
+
set(INPUT_PROGRAMMER ${ARDUINO_DEFAULT_PROGRAMMER})
|
380
|
+
endif()
|
381
|
+
required_variables(VARS INPUT_LIBRARY INPUT_EXAMPLE INPUT_BOARD
|
382
|
+
MSG "must define for target ${INPUT_NAME}")
|
383
|
+
|
384
|
+
set(ALL_LIBS)
|
385
|
+
set(ALL_SRCS)
|
386
|
+
|
387
|
+
setup_arduino_core(CORE_LIB ${INPUT_BOARD})
|
388
|
+
|
389
|
+
setup_arduino_example("${INPUT_NAME}" "${INPUT_LIBRARY}" "${INPUT_EXAMPLE}" ALL_SRCS)
|
390
|
+
|
391
|
+
if(NOT ALL_SRCS)
|
392
|
+
message(FATAL_ERROR "Missing sources for example, aborting!")
|
393
|
+
endif()
|
394
|
+
|
395
|
+
find_arduino_libraries(TARGET_LIBS "${ALL_SRCS}")
|
396
|
+
set(LIB_DEP_INCLUDES)
|
397
|
+
foreach(LIB_DEP ${TARGET_LIBS})
|
398
|
+
set(LIB_DEP_INCLUDES "${LIB_DEP_INCLUDES} -I\"${LIB_DEP}\"")
|
399
|
+
endforeach()
|
400
|
+
|
401
|
+
setup_arduino_libraries(ALL_LIBS ${INPUT_BOARD} "${ALL_SRCS}" "${LIB_DEP_INCLUDES}" "")
|
402
|
+
|
403
|
+
list(APPEND ALL_LIBS ${CORE_LIB} ${INPUT_LIBS})
|
404
|
+
|
405
|
+
setup_arduino_target(${INPUT_NAME} ${INPUT_BOARD} "${ALL_SRCS}" "${ALL_LIBS}" "${LIB_DEP_INCLUDES}" "" FALSE)
|
406
|
+
|
407
|
+
if(INPUT_PORT)
|
408
|
+
setup_arduino_upload(${INPUT_BOARD} ${INPUT_NAME} ${INPUT_PORT} "${INPUT_PROGRAMMER}" "${INPUT_AFLAGS}")
|
409
|
+
endif()
|
410
|
+
|
411
|
+
if(INPUT_SERIAL)
|
412
|
+
setup_serial_target(${INPUT_NAME} "${INPUT_SERIAL}" "${INPUT_PORT}")
|
413
|
+
endif()
|
414
|
+
endfunction()
|
415
|
+
|
416
|
+
#=============================================================================#
|
417
|
+
# Internal Functions
|
418
|
+
#=============================================================================#
|
419
|
+
|
420
|
+
#=============================================================================#
|
421
|
+
# [PRIVATE/INTERNAL]
|
422
|
+
#
|
423
|
+
# parse_generator_arguments(TARGET_NAME PREFIX OPTIONS ARGS MULTI_ARGS [ARG1 ARG2 .. ARGN])
|
424
|
+
#
|
425
|
+
# PREFIX - Parsed options prefix
|
426
|
+
# OPTIONS - List of options
|
427
|
+
# ARGS - List of one value keyword arguments
|
428
|
+
# MULTI_ARGS - List of multi value keyword arguments
|
429
|
+
# [ARG1 ARG2 .. ARGN] - command arguments [optional]
|
430
|
+
#
|
431
|
+
# Parses generator options from either variables or command arguments
|
432
|
+
#
|
433
|
+
#=============================================================================#
|
434
|
+
macro(PARSE_GENERATOR_ARGUMENTS TARGET_NAME PREFIX OPTIONS ARGS MULTI_ARGS)
|
435
|
+
cmake_parse_arguments(${PREFIX} "${OPTIONS}" "${ARGS}" "${MULTI_ARGS}" ${ARGN})
|
436
|
+
error_for_unparsed(${PREFIX})
|
437
|
+
load_generator_settings(${TARGET_NAME} ${PREFIX} ${OPTIONS} ${ARGS} ${MULTI_ARGS})
|
438
|
+
endmacro()
|
439
|
+
|
440
|
+
#=============================================================================#
|
441
|
+
# [PRIVATE/INTERNAL]
|
442
|
+
#
|
443
|
+
# load_board_settings()
|
444
|
+
#
|
445
|
+
# Load the Arduino SDK board settings from the boards.txt file.
|
446
|
+
#
|
447
|
+
#=============================================================================#
|
448
|
+
function(LOAD_BOARD_SETTINGS)
|
449
|
+
load_arduino_style_settings(ARDUINO_BOARDS "${ARDUINO_BOARDS_PATH}")
|
450
|
+
endfunction()
|
451
|
+
|
452
|
+
#=============================================================================#
|
453
|
+
# [PRIVATE/INTERNAL]
|
454
|
+
#
|
455
|
+
#=============================================================================#
|
456
|
+
function(LOAD_PROGRAMMERS_SETTINGS)
|
457
|
+
load_arduino_style_settings(ARDUINO_PROGRAMMERS "${ARDUINO_PROGRAMMERS_PATH}")
|
458
|
+
endfunction()
|
459
|
+
|
460
|
+
#=============================================================================#
|
461
|
+
# [PRIVATE/INTERNAL]
|
462
|
+
#
|
463
|
+
# load_generator_settings(TARGET_NAME PREFIX [SUFFIX_1 SUFFIX_2 .. SUFFIX_N])
|
464
|
+
#
|
465
|
+
# TARGET_NAME - The base name of the user settings
|
466
|
+
# PREFIX - The prefix name used for generator settings
|
467
|
+
# SUFFIX_XX - List of suffixes to load
|
468
|
+
#
|
469
|
+
# Loads a list of user settings into the generators scope. User settings have
|
470
|
+
# the following syntax:
|
471
|
+
#
|
472
|
+
# ${BASE_NAME}${SUFFIX}
|
473
|
+
#
|
474
|
+
# The BASE_NAME is the target name and the suffix is a specific generator settings.
|
475
|
+
#
|
476
|
+
# For every user setting found a generator setting is created of the follwoing fromat:
|
477
|
+
#
|
478
|
+
# ${PREFIX}${SUFFIX}
|
479
|
+
#
|
480
|
+
# The purpose of loading the settings into the generator is to not modify user settings
|
481
|
+
# and to have a generic naming of the settings within the generator.
|
482
|
+
#
|
483
|
+
#=============================================================================#
|
484
|
+
function(LOAD_GENERATOR_SETTINGS TARGET_NAME PREFIX)
|
485
|
+
foreach(GEN_SUFFIX ${ARGN})
|
486
|
+
if(${TARGET_NAME}_${GEN_SUFFIX} AND NOT ${PREFIX}_${GEN_SUFFIX})
|
487
|
+
set(${PREFIX}_${GEN_SUFFIX} ${${TARGET_NAME}_${GEN_SUFFIX}} PARENT_SCOPE)
|
488
|
+
endif()
|
489
|
+
endforeach()
|
490
|
+
endfunction()
|
491
|
+
|
492
|
+
#=============================================================================#
|
493
|
+
# [PRIVATE/INTERNAL]
|
494
|
+
#
|
495
|
+
# get_arduino_flags(COMPILE_FLAGS LINK_FLAGS BOARD_ID MANUAL)
|
496
|
+
#
|
497
|
+
# COMPILE_FLAGS_VAR -Variable holding compiler flags
|
498
|
+
# LINK_FLAGS_VAR - Variable holding linker flags
|
499
|
+
# BOARD_ID - The board id name
|
500
|
+
# MANUAL - (Advanced) Only use AVR Libc/Includes
|
501
|
+
#
|
502
|
+
# Configures the the build settings for the specified Arduino Board.
|
503
|
+
#
|
504
|
+
#=============================================================================#
|
505
|
+
function(get_arduino_flags COMPILE_FLAGS_VAR LINK_FLAGS_VAR BOARD_ID MANUAL)
|
506
|
+
|
507
|
+
set(BOARD_CORE ${${BOARD_ID}.build.core})
|
508
|
+
if(BOARD_CORE)
|
509
|
+
if(ARDUINO_SDK_VERSION MATCHES "([0-9]+)[.]([0-9]+)")
|
510
|
+
string(REPLACE "." "" ARDUINO_VERSION_DEFINE "${ARDUINO_SDK_VERSION}") # Normalize version (remove all periods)
|
511
|
+
set(ARDUINO_VERSION_DEFINE "")
|
512
|
+
if(CMAKE_MATCH_1 GREATER 0)
|
513
|
+
set(ARDUINO_VERSION_DEFINE "${CMAKE_MATCH_1}")
|
514
|
+
endif()
|
515
|
+
if(CMAKE_MATCH_2 GREATER 10)
|
516
|
+
set(ARDUINO_VERSION_DEFINE "${ARDUINO_VERSION_DEFINE}${CMAKE_MATCH_2}")
|
517
|
+
else()
|
518
|
+
set(ARDUINO_VERSION_DEFINE "${ARDUINO_VERSION_DEFINE}0${CMAKE_MATCH_2}")
|
519
|
+
endif()
|
520
|
+
else()
|
521
|
+
message("Invalid Arduino SDK Version (${ARDUINO_SDK_VERSION})")
|
522
|
+
endif()
|
523
|
+
|
524
|
+
# output
|
525
|
+
set(COMPILE_FLAGS "-DF_CPU=${${BOARD_ID}.build.f_cpu} -DARDUINO=${ARDUINO_VERSION_DEFINE} -mmcu=${${BOARD_ID}.build.mcu}")
|
526
|
+
if(DEFINED ${BOARD_ID}.build.vid)
|
527
|
+
set(COMPILE_FLAGS "${COMPILE_FLAGS} -DUSB_VID=${${BOARD_ID}.build.vid}")
|
528
|
+
endif()
|
529
|
+
if(DEFINED ${BOARD_ID}.build.pid)
|
530
|
+
set(COMPILE_FLAGS "${COMPILE_FLAGS} -DUSB_PID=${${BOARD_ID}.build.pid}")
|
531
|
+
endif()
|
532
|
+
if(NOT MANUAL)
|
533
|
+
set(COMPILE_FLAGS "${COMPILE_FLAGS} -I\"${ARDUINO_CORES_PATH}/${BOARD_CORE}\" -I\"${ARDUINO_LIBRARIES_PATH}\"")
|
534
|
+
endif()
|
535
|
+
set(LINK_FLAGS "-mmcu=${${BOARD_ID}.build.mcu}")
|
536
|
+
if(ARDUINO_SDK_VERSION VERSION_GREATER 1.0 OR ARDUINO_SDK_VERSION VERSION_EQUAL 1.0)
|
537
|
+
set(PIN_HEADER ${${BOARD_ID}.build.variant})
|
538
|
+
if(NOT MANUAL)
|
539
|
+
set(COMPILE_FLAGS "${COMPILE_FLAGS} -I\"${ARDUINO_VARIANTS_PATH}/${PIN_HEADER}\"")
|
540
|
+
endif()
|
541
|
+
endif()
|
542
|
+
|
543
|
+
# output
|
544
|
+
set(${COMPILE_FLAGS_VAR} "${COMPILE_FLAGS}" PARENT_SCOPE)
|
545
|
+
set(${LINK_FLAGS_VAR} "${LINK_FLAGS}" PARENT_SCOPE)
|
546
|
+
|
547
|
+
else()
|
548
|
+
message(FATAL_ERROR "Invalid Arduino board ID (${BOARD_ID}), aborting.")
|
549
|
+
endif()
|
550
|
+
endfunction()
|
551
|
+
|
552
|
+
#=============================================================================#
|
553
|
+
# [PRIVATE/INTERNAL]
|
554
|
+
#
|
555
|
+
# setup_arduino_core(VAR_NAME BOARD_ID)
|
556
|
+
#
|
557
|
+
# VAR_NAME - Variable name that will hold the generated library name
|
558
|
+
# BOARD_ID - Arduino board id
|
559
|
+
#
|
560
|
+
# Creates the Arduino Core library for the specified board,
|
561
|
+
# each board gets it's own version of the library.
|
562
|
+
#
|
563
|
+
#=============================================================================#
|
564
|
+
function(setup_arduino_core VAR_NAME BOARD_ID)
|
565
|
+
set(CORE_LIB_NAME ${BOARD_ID}_CORE)
|
566
|
+
set(BOARD_CORE ${${BOARD_ID}.build.core})
|
567
|
+
if(BOARD_CORE)
|
568
|
+
if(NOT TARGET ${CORE_LIB_NAME})
|
569
|
+
set(BOARD_CORE_PATH ${ARDUINO_CORES_PATH}/${BOARD_CORE})
|
570
|
+
find_sources(CORE_SRCS ${BOARD_CORE_PATH} True)
|
571
|
+
# Debian/Ubuntu fix
|
572
|
+
list(REMOVE_ITEM CORE_SRCS "${BOARD_CORE_PATH}/main.cxx")
|
573
|
+
add_library(${CORE_LIB_NAME} ${CORE_SRCS})
|
574
|
+
get_arduino_flags(ARDUINO_COMPILE_FLAGS ARDUINO_LINK_FLAGS ${BOARD_ID} FALSE)
|
575
|
+
set_target_properties(${CORE_LIB_NAME} PROPERTIES
|
576
|
+
COMPILE_FLAGS "${ARDUINO_COMPILE_FLAGS}"
|
577
|
+
LINK_FLAGS "${ARDUINO_LINK_FLAGS}")
|
578
|
+
endif()
|
579
|
+
set(${VAR_NAME} ${CORE_LIB_NAME} PARENT_SCOPE)
|
580
|
+
endif()
|
581
|
+
endfunction()
|
582
|
+
|
583
|
+
#=============================================================================#
|
584
|
+
# [PRIVATE/INTERNAL]
|
585
|
+
#
|
586
|
+
# find_arduino_libraries(VAR_NAME SRCS)
|
587
|
+
#
|
588
|
+
# VAR_NAME - Variable name which will hold the results
|
589
|
+
# SRCS - Sources that will be analized
|
590
|
+
#
|
591
|
+
# returns a list of paths to libraries found.
|
592
|
+
#
|
593
|
+
# Finds all Arduino type libraries included in sources. Available libraries
|
594
|
+
# are ${ARDUINO_SDK_PATH}/libraries and ${CMAKE_CURRENT_SOURCE_DIR}.
|
595
|
+
#
|
596
|
+
# A Arduino library is a folder that has the same name as the include header.
|
597
|
+
# For example, if we have a include "#include <LibraryName.h>" then the following
|
598
|
+
# directory structure is considered a Arduino library:
|
599
|
+
#
|
600
|
+
# LibraryName/
|
601
|
+
# |- LibraryName.h
|
602
|
+
# `- LibraryName.c
|
603
|
+
#
|
604
|
+
# If such a directory is found then all sources within that directory are considred
|
605
|
+
# to be part of that Arduino library.
|
606
|
+
#
|
607
|
+
#=============================================================================#
|
608
|
+
function(find_arduino_libraries VAR_NAME SRCS)
|
609
|
+
set(ARDUINO_LIBS )
|
610
|
+
foreach(SRC ${SRCS})
|
611
|
+
if(NOT (EXISTS ${SRC} OR
|
612
|
+
EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${SRC} OR
|
613
|
+
EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${SRC}))
|
614
|
+
message(FATAL_ERROR "Invalid source file: ${SRC}")
|
615
|
+
endif()
|
616
|
+
file(STRINGS ${SRC} SRC_CONTENTS)
|
617
|
+
foreach(SRC_LINE ${SRC_CONTENTS})
|
618
|
+
if("${SRC_LINE}" MATCHES "^ *#include *[<\"](.*)[>\"]")
|
619
|
+
get_filename_component(INCLUDE_NAME ${CMAKE_MATCH_1} NAME_WE)
|
620
|
+
get_property(LIBRARY_SEARCH_PATH
|
621
|
+
DIRECTORY # Property Scope
|
622
|
+
PROPERTY LINK_DIRECTORIES)
|
623
|
+
foreach(LIB_SEARCH_PATH ${LIBRARY_SEARCH_PATH} ${ARDUINO_LIBRARIES_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libraries ${ARDUINO_EXTRA_LIBRARIES_PATH})
|
624
|
+
if(EXISTS ${LIB_SEARCH_PATH}/${INCLUDE_NAME}/${CMAKE_MATCH_1})
|
625
|
+
list(APPEND ARDUINO_LIBS ${LIB_SEARCH_PATH}/${INCLUDE_NAME})
|
626
|
+
break()
|
627
|
+
endif()
|
628
|
+
endforeach()
|
629
|
+
endif()
|
630
|
+
endforeach()
|
631
|
+
endforeach()
|
632
|
+
if(ARDUINO_LIBS)
|
633
|
+
list(REMOVE_DUPLICATES ARDUINO_LIBS)
|
634
|
+
endif()
|
635
|
+
set(${VAR_NAME} ${ARDUINO_LIBS} PARENT_SCOPE)
|
636
|
+
endfunction()
|
637
|
+
|
638
|
+
#=============================================================================#
|
639
|
+
# [PRIVATE/INTERNAL]
|
640
|
+
#
|
641
|
+
# setup_arduino_library(VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLAGS)
|
642
|
+
#
|
643
|
+
# VAR_NAME - Vairable wich will hold the generated library names
|
644
|
+
# BOARD_ID - Board ID
|
645
|
+
# LIB_PATH - Path of the library
|
646
|
+
# COMPILE_FLAGS - Compile flags
|
647
|
+
# LINK_FLAGS - Link flags
|
648
|
+
#
|
649
|
+
# Creates an Arduino library, with all it's library dependencies.
|
650
|
+
#
|
651
|
+
# ${LIB_NAME}_RECURSE controls if the library will recurse
|
652
|
+
# when looking for source files.
|
653
|
+
#
|
654
|
+
#=============================================================================#
|
655
|
+
|
656
|
+
# For known libraries can list recurse here
|
657
|
+
set(Wire_RECURSE True)
|
658
|
+
set(Ethernet_RECURSE True)
|
659
|
+
set(SD_RECURSE True)
|
660
|
+
function(setup_arduino_library VAR_NAME BOARD_ID LIB_PATH COMPILE_FLAGS LINK_FLAGS)
|
661
|
+
set(LIB_TARGETS)
|
662
|
+
|
663
|
+
get_filename_component(LIB_NAME ${LIB_PATH} NAME)
|
664
|
+
set(TARGET_LIB_NAME ${BOARD_ID}_${LIB_NAME})
|
665
|
+
if(NOT TARGET ${TARGET_LIB_NAME})
|
666
|
+
string(REGEX REPLACE ".*/" "" LIB_SHORT_NAME ${LIB_NAME})
|
667
|
+
|
668
|
+
# Detect if recursion is needed
|
669
|
+
if (NOT DEFINED ${LIB_SHORT_NAME}_RECURSE)
|
670
|
+
set(${LIB_SHORT_NAME}_RECURSE False)
|
671
|
+
endif()
|
672
|
+
|
673
|
+
find_sources(LIB_SRCS ${LIB_PATH} ${${LIB_SHORT_NAME}_RECURSE})
|
674
|
+
if(LIB_SRCS)
|
675
|
+
|
676
|
+
arduino_debug_msg("Generating Arduino ${LIB_NAME} library")
|
677
|
+
add_library(${TARGET_LIB_NAME} STATIC ${LIB_SRCS})
|
678
|
+
|
679
|
+
get_arduino_flags(ARDUINO_COMPILE_FLAGS ARDUINO_LINK_FLAGS ${BOARD_ID} FALSE)
|
680
|
+
|
681
|
+
find_arduino_libraries(LIB_DEPS "${LIB_SRCS}")
|
682
|
+
|
683
|
+
foreach(LIB_DEP ${LIB_DEPS})
|
684
|
+
setup_arduino_library(DEP_LIB_SRCS ${BOARD_ID} ${LIB_DEP} "${COMPILE_FLAGS}" "${LINK_FLAGS}")
|
685
|
+
list(APPEND LIB_TARGETS ${DEP_LIB_SRCS})
|
686
|
+
endforeach()
|
687
|
+
|
688
|
+
set_target_properties(${TARGET_LIB_NAME} PROPERTIES
|
689
|
+
COMPILE_FLAGS "${ARDUINO_COMPILE_FLAGS} -I\"${LIB_PATH}\" -I\"${LIB_PATH}/utility\" ${COMPILE_FLAGS}"
|
690
|
+
LINK_FLAGS "${ARDUINO_LINK_FLAGS} ${LINK_FLAGS}")
|
691
|
+
|
692
|
+
target_link_libraries(${TARGET_LIB_NAME} ${BOARD_ID}_CORE ${LIB_TARGETS})
|
693
|
+
list(APPEND LIB_TARGETS ${TARGET_LIB_NAME})
|
694
|
+
|
695
|
+
endif()
|
696
|
+
else()
|
697
|
+
# Target already exists, skiping creating
|
698
|
+
list(APPEND LIB_TARGETS ${TARGET_LIB_NAME})
|
699
|
+
endif()
|
700
|
+
if(LIB_TARGETS)
|
701
|
+
list(REMOVE_DUPLICATES LIB_TARGETS)
|
702
|
+
endif()
|
703
|
+
set(${VAR_NAME} ${LIB_TARGETS} PARENT_SCOPE)
|
704
|
+
endfunction()
|
705
|
+
|
706
|
+
#=============================================================================#
|
707
|
+
# [PRIVATE/INTERNAL]
|
708
|
+
#
|
709
|
+
# setup_arduino_libraries(VAR_NAME BOARD_ID SRCS COMPILE_FLAGS LINK_FLAGS)
|
710
|
+
#
|
711
|
+
# VAR_NAME - Vairable wich will hold the generated library names
|
712
|
+
# BOARD_ID - Board ID
|
713
|
+
# SRCS - source files
|
714
|
+
# COMPILE_FLAGS - Compile flags
|
715
|
+
# LINK_FLAGS - Linker flags
|
716
|
+
#
|
717
|
+
# Finds and creates all dependency libraries based on sources.
|
718
|
+
#
|
719
|
+
#=============================================================================#
|
720
|
+
function(setup_arduino_libraries VAR_NAME BOARD_ID SRCS COMPILE_FLAGS LINK_FLAGS)
|
721
|
+
set(LIB_TARGETS)
|
722
|
+
find_arduino_libraries(TARGET_LIBS "${SRCS}")
|
723
|
+
foreach(TARGET_LIB ${TARGET_LIBS})
|
724
|
+
# Create static library instead of returning sources
|
725
|
+
setup_arduino_library(LIB_DEPS ${BOARD_ID} ${TARGET_LIB} "${COMPILE_FLAGS}" "${LINK_FLAGS}")
|
726
|
+
list(APPEND LIB_TARGETS ${LIB_DEPS})
|
727
|
+
endforeach()
|
728
|
+
set(${VAR_NAME} ${LIB_TARGETS} PARENT_SCOPE)
|
729
|
+
endfunction()
|
730
|
+
|
731
|
+
|
732
|
+
#=============================================================================#
|
733
|
+
# [PRIVATE/INTERNAL]
|
734
|
+
#
|
735
|
+
# setup_arduino_target(TARGET_NAME ALL_SRCS ALL_LIBS COMPILE_FLAGS LINK_FLAGS MANUAL)
|
736
|
+
#
|
737
|
+
# TARGET_NAME - Target name
|
738
|
+
# BOARD_ID - Arduino board ID
|
739
|
+
# ALL_SRCS - All sources
|
740
|
+
# ALL_LIBS - All libraries
|
741
|
+
# COMPILE_FLAGS - Compile flags
|
742
|
+
# LINK_FLAGS - Linker flags
|
743
|
+
# MANUAL - (Advanced) Only use AVR Libc/Includes
|
744
|
+
#
|
745
|
+
# Creates an Arduino firmware target.
|
746
|
+
#
|
747
|
+
#=============================================================================#
|
748
|
+
function(setup_arduino_target TARGET_NAME BOARD_ID ALL_SRCS ALL_LIBS COMPILE_FLAGS LINK_FLAGS MANUAL)
|
749
|
+
|
750
|
+
add_executable(${TARGET_NAME} ${ALL_SRCS})
|
751
|
+
set_target_properties(${TARGET_NAME} PROPERTIES SUFFIX ".elf")
|
752
|
+
|
753
|
+
get_arduino_flags(ARDUINO_COMPILE_FLAGS ARDUINO_LINK_FLAGS ${BOARD_ID} ${MANUAL})
|
754
|
+
|
755
|
+
set_target_properties(${TARGET_NAME} PROPERTIES
|
756
|
+
COMPILE_FLAGS "${ARDUINO_COMPILE_FLAGS} ${COMPILE_FLAGS}"
|
757
|
+
LINK_FLAGS "${ARDUINO_LINK_FLAGS} ${LINK_FLAGS}")
|
758
|
+
target_link_libraries(${TARGET_NAME} ${ALL_LIBS} "-lc -lm")
|
759
|
+
|
760
|
+
set(TARGET_PATH ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME})
|
761
|
+
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
762
|
+
COMMAND ${CMAKE_OBJCOPY}
|
763
|
+
ARGS ${ARDUINO_OBJCOPY_EEP_FLAGS}
|
764
|
+
${TARGET_PATH}.elf
|
765
|
+
${TARGET_PATH}.eep
|
766
|
+
COMMENT "Generating EEP image"
|
767
|
+
VERBATIM)
|
768
|
+
|
769
|
+
# Convert firmware image to ASCII HEX format
|
770
|
+
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
771
|
+
COMMAND ${CMAKE_OBJCOPY}
|
772
|
+
ARGS ${ARDUINO_OBJCOPY_HEX_FLAGS}
|
773
|
+
${TARGET_PATH}.elf
|
774
|
+
${TARGET_PATH}.hex
|
775
|
+
COMMENT "Generating HEX image"
|
776
|
+
VERBATIM)
|
777
|
+
|
778
|
+
# Display target size
|
779
|
+
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
|
780
|
+
COMMAND ${CMAKE_COMMAND}
|
781
|
+
ARGS -DFIRMWARE_IMAGE=${TARGET_PATH}.hex
|
782
|
+
-P ${ARDUINO_SIZE_SCRIPT}
|
783
|
+
COMMENT "Calculating image size"
|
784
|
+
VERBATIM)
|
785
|
+
|
786
|
+
# Create ${TARGET_NAME}-size target
|
787
|
+
add_custom_target(${TARGET_NAME}-size
|
788
|
+
COMMAND ${CMAKE_COMMAND}
|
789
|
+
-DFIRMWARE_IMAGE=${TARGET_PATH}.hex
|
790
|
+
-P ${ARDUINO_SIZE_SCRIPT}
|
791
|
+
DEPENDS ${TARGET_NAME}
|
792
|
+
COMMENT "Calculating ${TARGET_NAME} image size")
|
793
|
+
endfunction()
|
794
|
+
|
795
|
+
#=============================================================================#
|
796
|
+
# [PRIVATE/INTERNAL]
|
797
|
+
#
|
798
|
+
# setup_arduino_upload(BOARD_ID TARGET_NAME PORT)
|
799
|
+
#
|
800
|
+
# BOARD_ID - Arduino board id
|
801
|
+
# TARGET_NAME - Target name
|
802
|
+
# PORT - Serial port for upload
|
803
|
+
# PROGRAMMER_ID - Programmer ID
|
804
|
+
# AVRDUDE_FLAGS - avrdude flags
|
805
|
+
#
|
806
|
+
# Create an upload target (${TARGET_NAME}-upload) for the specified Arduino target.
|
807
|
+
#
|
808
|
+
#=============================================================================#
|
809
|
+
function(setup_arduino_upload BOARD_ID TARGET_NAME PORT PROGRAMMER_ID AVRDUDE_FLAGS)
|
810
|
+
setup_arduino_bootloader_upload(${TARGET_NAME} ${BOARD_ID} ${PORT} "${AVRDUDE_FLAGS}")
|
811
|
+
|
812
|
+
# Add programmer support if defined
|
813
|
+
if(PROGRAMMER_ID AND ${PROGRAMMER_ID}.protocol)
|
814
|
+
setup_arduino_programmer_burn(${TARGET_NAME} ${BOARD_ID} ${PROGRAMMER_ID} ${PORT} "${AVRDUDE_FLAGS}")
|
815
|
+
setup_arduino_bootloader_burn(${TARGET_NAME} ${BOARD_ID} ${PROGRAMMER_ID} ${PORT} "${AVRDUDE_FLAGS}")
|
816
|
+
endif()
|
817
|
+
endfunction()
|
818
|
+
|
819
|
+
|
820
|
+
#=============================================================================#
|
821
|
+
# [PRIVATE/INTERNAL]
|
822
|
+
#
|
823
|
+
# setup_arduino_bootloader_upload(TARGET_NAME BOARD_ID PORT)
|
824
|
+
#
|
825
|
+
# TARGET_NAME - target name
|
826
|
+
# BOARD_ID - board id
|
827
|
+
# PORT - serial port
|
828
|
+
# AVRDUDE_FLAGS - avrdude flags (override)
|
829
|
+
#
|
830
|
+
# Set up target for upload firmware via the bootloader.
|
831
|
+
#
|
832
|
+
# The target for uploading the firmware is ${TARGET_NAME}-upload .
|
833
|
+
#
|
834
|
+
#=============================================================================#
|
835
|
+
function(setup_arduino_bootloader_upload TARGET_NAME BOARD_ID PORT AVRDUDE_FLAGS)
|
836
|
+
set(UPLOAD_TARGET ${TARGET_NAME}-upload)
|
837
|
+
set(AVRDUDE_ARGS)
|
838
|
+
|
839
|
+
setup_arduino_bootloader_args(${BOARD_ID} ${TARGET_NAME} ${PORT} "${AVRDUDE_FLAGS}" AVRDUDE_ARGS)
|
840
|
+
|
841
|
+
if(NOT AVRDUDE_ARGS)
|
842
|
+
message("Could not generate default avrdude bootloader args, aborting!")
|
843
|
+
return()
|
844
|
+
endif()
|
845
|
+
|
846
|
+
list(APPEND AVRDUDE_ARGS "-Uflash:w:${TARGET_NAME}.hex")
|
847
|
+
add_custom_target(${UPLOAD_TARGET}
|
848
|
+
${ARDUINO_AVRDUDE_PROGRAM}
|
849
|
+
${AVRDUDE_ARGS}
|
850
|
+
DEPENDS ${TARGET_NAME})
|
851
|
+
|
852
|
+
# Global upload target
|
853
|
+
if(NOT TARGET upload)
|
854
|
+
add_custom_target(upload)
|
855
|
+
endif()
|
856
|
+
|
857
|
+
add_dependencies(upload ${UPLOAD_TARGET})
|
858
|
+
endfunction()
|
859
|
+
|
860
|
+
#=============================================================================#
|
861
|
+
# [PRIVATE/INTERNAL]
|
862
|
+
#
|
863
|
+
# setup_arduino_programmer_burn(TARGET_NAME BOARD_ID PROGRAMMER PORT AVRDUDE_FLAGS)
|
864
|
+
#
|
865
|
+
# TARGET_NAME - name of target to burn
|
866
|
+
# BOARD_ID - board id
|
867
|
+
# PROGRAMMER - programmer id
|
868
|
+
# PORT - serial port
|
869
|
+
# AVRDUDE_FLAGS - avrdude flags (override)
|
870
|
+
#
|
871
|
+
# Sets up target for burning firmware via a programmer.
|
872
|
+
#
|
873
|
+
# The target for burning the firmware is ${TARGET_NAME}-burn .
|
874
|
+
#
|
875
|
+
#=============================================================================#
|
876
|
+
function(setup_arduino_programmer_burn TARGET_NAME BOARD_ID PROGRAMMER PORT AVRDUDE_FLAGS)
|
877
|
+
set(PROGRAMMER_TARGET ${TARGET_NAME}-burn)
|
878
|
+
|
879
|
+
set(AVRDUDE_ARGS)
|
880
|
+
|
881
|
+
setup_arduino_programmer_args(${BOARD_ID} ${PROGRAMMER} ${TARGET_NAME} ${PORT} "${AVRDUDE_FLAGS}" AVRDUDE_ARGS)
|
882
|
+
|
883
|
+
if(NOT AVRDUDE_ARGS)
|
884
|
+
message("Could not generate default avrdude programmer args, aborting!")
|
885
|
+
return()
|
886
|
+
endif()
|
887
|
+
|
888
|
+
list(APPEND AVRDUDE_ARGS "-Uflash:w:${TARGET_NAME}.hex")
|
889
|
+
|
890
|
+
add_custom_target(${PROGRAMMER_TARGET}
|
891
|
+
${ARDUINO_AVRDUDE_PROGRAM}
|
892
|
+
${AVRDUDE_ARGS}
|
893
|
+
DEPENDS ${TARGET_NAME})
|
894
|
+
endfunction()
|
895
|
+
|
896
|
+
#=============================================================================#
|
897
|
+
# [PRIVATE/INTERNAL]
|
898
|
+
#
|
899
|
+
# setup_arduino_bootloader_burn(TARGET_NAME BOARD_ID PROGRAMMER PORT AVRDUDE_FLAGS)
|
900
|
+
#
|
901
|
+
# TARGET_NAME - name of target to burn
|
902
|
+
# BOARD_ID - board id
|
903
|
+
# PROGRAMMER - programmer id
|
904
|
+
# PORT - serial port
|
905
|
+
# AVRDUDE_FLAGS - avrdude flags (override)
|
906
|
+
#
|
907
|
+
# Create a target for burning a bootloader via a programmer.
|
908
|
+
#
|
909
|
+
# The target for burning the bootloader is ${TARGET_NAME}-burn-bootloader
|
910
|
+
#
|
911
|
+
#=============================================================================#
|
912
|
+
function(setup_arduino_bootloader_burn TARGET_NAME BOARD_ID PROGRAMMER PORT AVRDUDE_FLAGS)
|
913
|
+
set(BOOTLOADER_TARGET ${TARGET_NAME}-burn-bootloader)
|
914
|
+
|
915
|
+
set(AVRDUDE_ARGS)
|
916
|
+
|
917
|
+
setup_arduino_programmer_args(${BOARD_ID} ${PROGRAMMER} ${TARGET_NAME} ${PORT} "${AVRDUDE_FLAGS}" AVRDUDE_ARGS)
|
918
|
+
|
919
|
+
if(NOT AVRDUDE_ARGS)
|
920
|
+
message("Could not generate default avrdude programmer args, aborting!")
|
921
|
+
return()
|
922
|
+
endif()
|
923
|
+
|
924
|
+
foreach( ITEM unlock_bits high_fuses low_fuses path file)
|
925
|
+
if(NOT ${BOARD_ID}.bootloader.${ITEM})
|
926
|
+
message("Missing ${BOARD_ID}.bootloader.${ITEM}, not creating bootloader burn target ${BOOTLOADER_TARGET}.")
|
927
|
+
return()
|
928
|
+
endif()
|
929
|
+
endforeach()
|
930
|
+
|
931
|
+
if(NOT EXISTS "${ARDUINO_BOOTLOADERS_PATH}/${${BOARD_ID}.bootloader.path}/${${BOARD_ID}.bootloader.file}")
|
932
|
+
message("${ARDUINO_BOOTLOADERS_PATH}/${${BOARD_ID}.bootloader.path}/${${BOARD_ID}.bootloader.file}")
|
933
|
+
message("Missing bootloader image, not creating bootloader burn target ${BOOTLOADER_TARGET}.")
|
934
|
+
return()
|
935
|
+
endif()
|
936
|
+
|
937
|
+
# Erase the chip
|
938
|
+
list(APPEND AVRDUDE_ARGS "-e")
|
939
|
+
|
940
|
+
# Set unlock bits and fuses (because chip is going to be erased)
|
941
|
+
list(APPEND AVRDUDE_ARGS "-Ulock:w:${${BOARD_ID}.bootloader.unlock_bits}:m")
|
942
|
+
if(${BOARD_ID}.bootloader.extended_fuses)
|
943
|
+
list(APPEND AVRDUDE_ARGS "-Uefuse:w:${${BOARD_ID}.bootloader.extended_fuses}:m")
|
944
|
+
endif()
|
945
|
+
list(APPEND AVRDUDE_ARGS
|
946
|
+
"-Uhfuse:w:${${BOARD_ID}.bootloader.high_fuses}:m"
|
947
|
+
"-Ulfuse:w:${${BOARD_ID}.bootloader.low_fuses}:m")
|
948
|
+
|
949
|
+
# Set bootloader image
|
950
|
+
list(APPEND AVRDUDE_ARGS "-Uflash:w:${${BOARD_ID}.bootloader.file}:i")
|
951
|
+
|
952
|
+
# Set lockbits
|
953
|
+
list(APPEND AVRDUDE_ARGS "-Ulock:w:${${BOARD_ID}.bootloader.lock_bits}:m")
|
954
|
+
|
955
|
+
# Create burn bootloader target
|
956
|
+
add_custom_target(${BOOTLOADER_TARGET}
|
957
|
+
${ARDUINO_AVRDUDE_PROGRAM}
|
958
|
+
${AVRDUDE_ARGS}
|
959
|
+
WORKING_DIRECTORY ${ARDUINO_BOOTLOADERS_PATH}/${${BOARD_ID}.bootloader.path}
|
960
|
+
DEPENDS ${TARGET_NAME})
|
961
|
+
endfunction()
|
962
|
+
|
963
|
+
#=============================================================================#
|
964
|
+
# [PRIVATE/INTERNAL]
|
965
|
+
#
|
966
|
+
# setup_arduino_programmer_args(BOARD_ID PROGRAMMER TARGET_NAME PORT AVRDUDE_FLAGS OUTPUT_VAR)
|
967
|
+
#
|
968
|
+
# BOARD_ID - board id
|
969
|
+
# PROGRAMMER - programmer id
|
970
|
+
# TARGET_NAME - target name
|
971
|
+
# PORT - serial port
|
972
|
+
# AVRDUDE_FLAGS - avrdude flags (override)
|
973
|
+
# OUTPUT_VAR - name of output variable for result
|
974
|
+
#
|
975
|
+
# Sets up default avrdude settings for burning firmware via a programmer.
|
976
|
+
#=============================================================================#
|
977
|
+
function(setup_arduino_programmer_args BOARD_ID PROGRAMMER TARGET_NAME PORT AVRDUDE_FLAGS OUTPUT_VAR)
|
978
|
+
set(AVRDUDE_ARGS ${${OUTPUT_VAR}})
|
979
|
+
|
980
|
+
if(NOT AVRDUDE_FLAGS)
|
981
|
+
set(AVRDUDE_FLAGS ${ARDUINO_AVRDUDE_FLAGS})
|
982
|
+
endif()
|
983
|
+
|
984
|
+
list(APPEND AVRDUDE_ARGS "-C${ARDUINO_AVRDUDE_CONFIG_PATH}")
|
985
|
+
|
986
|
+
#TODO: Check mandatory settings before continuing
|
987
|
+
if(NOT ${PROGRAMMER}.protocol)
|
988
|
+
message(FATAL_ERROR "Missing ${PROGRAMMER}.protocol, aborting!")
|
989
|
+
endif()
|
990
|
+
|
991
|
+
list(APPEND AVRDUDE_ARGS "-c${${PROGRAMMER}.protocol}") # Set programmer
|
992
|
+
|
993
|
+
if(${PROGRAMMER}.communication STREQUAL "usb")
|
994
|
+
list(APPEND AVRDUDE_ARGS "-Pusb") # Set USB as port
|
995
|
+
elseif(${PROGRAMMER}.communication STREQUAL "serial")
|
996
|
+
list(APPEND AVRDUDE_ARGS "-P${PORT}") # Set port
|
997
|
+
if(${PROGRAMMER}.speed)
|
998
|
+
list(APPEND AVRDUDE_ARGS "-b${${PROGRAMMER}.speed}") # Set baud rate
|
999
|
+
endif()
|
1000
|
+
endif()
|
1001
|
+
|
1002
|
+
if(${PROGRAMMER}.force)
|
1003
|
+
list(APPEND AVRDUDE_ARGS "-F") # Set force
|
1004
|
+
endif()
|
1005
|
+
|
1006
|
+
if(${PROGRAMMER}.delay)
|
1007
|
+
list(APPEND AVRDUDE_ARGS "-i${${PROGRAMMER}.delay}") # Set delay
|
1008
|
+
endif()
|
1009
|
+
|
1010
|
+
list(APPEND AVRDUDE_ARGS "-p${${BOARD_ID}.build.mcu}") # MCU Type
|
1011
|
+
|
1012
|
+
list(APPEND AVRDUDE_ARGS ${AVRDUDE_FLAGS})
|
1013
|
+
|
1014
|
+
set(${OUTPUT_VAR} ${AVRDUDE_ARGS} PARENT_SCOPE)
|
1015
|
+
endfunction()
|
1016
|
+
|
1017
|
+
#=============================================================================#
|
1018
|
+
# [PRIVATE/INTERNAL]
|
1019
|
+
#
|
1020
|
+
# setup_arduino_bootloader_args(BOARD_ID TARGET_NAME PORT AVRDUDE_FLAGS OUTPUT_VAR)
|
1021
|
+
#
|
1022
|
+
# BOARD_ID - board id
|
1023
|
+
# TARGET_NAME - target name
|
1024
|
+
# PORT - serial port
|
1025
|
+
# AVRDUDE_FLAGS - avrdude flags (override)
|
1026
|
+
# OUTPUT_VAR - name of output variable for result
|
1027
|
+
#
|
1028
|
+
# Sets up default avrdude settings for uploading firmware via the bootloader.
|
1029
|
+
#=============================================================================#
|
1030
|
+
function(setup_arduino_bootloader_args BOARD_ID TARGET_NAME PORT AVRDUDE_FLAGS OUTPUT_VAR)
|
1031
|
+
set(AVRDUDE_ARGS ${${OUTPUT_VAR}})
|
1032
|
+
|
1033
|
+
if(NOT AVRDUDE_FLAGS)
|
1034
|
+
set(AVRDUDE_FLAGS ${ARDUINO_AVRDUDE_FLAGS})
|
1035
|
+
endif()
|
1036
|
+
|
1037
|
+
list(APPEND AVRDUDE_ARGS
|
1038
|
+
"-C${ARDUINO_AVRDUDE_CONFIG_PATH}" # avrdude config
|
1039
|
+
"-p${${BOARD_ID}.build.mcu}" # MCU Type
|
1040
|
+
)
|
1041
|
+
|
1042
|
+
# Programmer
|
1043
|
+
if(${BOARD_ID}.upload.protocol STREQUAL "stk500")
|
1044
|
+
list(APPEND AVRDUDE_ARGS "-cstk500v1")
|
1045
|
+
else()
|
1046
|
+
list(APPEND AVRDUDE_ARGS "-c${${BOARD_ID}.upload.protocol}")
|
1047
|
+
endif()
|
1048
|
+
|
1049
|
+
list(APPEND AVRDUDE_ARGS
|
1050
|
+
"-b${${BOARD_ID}.upload.speed}" # Baud rate
|
1051
|
+
"-P${PORT}" # Serial port
|
1052
|
+
"-D" # Dont erase
|
1053
|
+
)
|
1054
|
+
|
1055
|
+
list(APPEND AVRDUDE_ARGS ${AVRDUDE_FLAGS})
|
1056
|
+
|
1057
|
+
set(${OUTPUT_VAR} ${AVRDUDE_ARGS} PARENT_SCOPE)
|
1058
|
+
endfunction()
|
1059
|
+
|
1060
|
+
#=============================================================================#
|
1061
|
+
# [PRIVATE/INTERNAL]
|
1062
|
+
#
|
1063
|
+
# find_sources(VAR_NAME LIB_PATH RECURSE)
|
1064
|
+
#
|
1065
|
+
# VAR_NAME - Variable name that will hold the detected sources
|
1066
|
+
# LIB_PATH - The base path
|
1067
|
+
# RECURSE - Whether or not to recurse
|
1068
|
+
#
|
1069
|
+
# Finds all C/C++ sources located at the specified path.
|
1070
|
+
#
|
1071
|
+
#=============================================================================#
|
1072
|
+
function(find_sources VAR_NAME LIB_PATH RECURSE)
|
1073
|
+
set(FILE_SEARCH_LIST
|
1074
|
+
${LIB_PATH}/*.cpp
|
1075
|
+
${LIB_PATH}/*.c
|
1076
|
+
${LIB_PATH}/*.cc
|
1077
|
+
${LIB_PATH}/*.cxx
|
1078
|
+
${LIB_PATH}/*.h
|
1079
|
+
${LIB_PATH}/*.hh
|
1080
|
+
${LIB_PATH}/*.hxx)
|
1081
|
+
|
1082
|
+
if(RECURSE)
|
1083
|
+
file(GLOB_RECURSE LIB_FILES ${FILE_SEARCH_LIST})
|
1084
|
+
else()
|
1085
|
+
file(GLOB LIB_FILES ${FILE_SEARCH_LIST})
|
1086
|
+
endif()
|
1087
|
+
|
1088
|
+
if(LIB_FILES)
|
1089
|
+
set(${VAR_NAME} ${LIB_FILES} PARENT_SCOPE)
|
1090
|
+
endif()
|
1091
|
+
endfunction()
|
1092
|
+
|
1093
|
+
#=============================================================================#
|
1094
|
+
# [PRIVATE/INTERNAL]
|
1095
|
+
#
|
1096
|
+
# setup_serial_target(TARGET_NAME CMD)
|
1097
|
+
#
|
1098
|
+
# TARGET_NAME - Target name
|
1099
|
+
# CMD - Serial terminal command
|
1100
|
+
#
|
1101
|
+
# Creates a target (${TARGET_NAME}-serial) for launching the serial termnial.
|
1102
|
+
#
|
1103
|
+
#=============================================================================#
|
1104
|
+
function(setup_serial_target TARGET_NAME CMD SERIAL_PORT)
|
1105
|
+
string(CONFIGURE "${CMD}" FULL_CMD @ONLY)
|
1106
|
+
add_custom_target(${TARGET_NAME}-serial
|
1107
|
+
COMMAND ${FULL_CMD})
|
1108
|
+
endfunction()
|
1109
|
+
|
1110
|
+
|
1111
|
+
#=============================================================================#
|
1112
|
+
# [PRIVATE/INTERNAL]
|
1113
|
+
#
|
1114
|
+
# detect_arduino_version(VAR_NAME)
|
1115
|
+
#
|
1116
|
+
# VAR_NAME - Variable name where the detected version will be saved
|
1117
|
+
#
|
1118
|
+
# Detects the Arduino SDK Version based on the revisions.txt file. The
|
1119
|
+
# following variables will be generated:
|
1120
|
+
#
|
1121
|
+
# ${VAR_NAME} -> the full version (major.minor.patch)
|
1122
|
+
# ${VAR_NAME}_MAJOR -> the major version
|
1123
|
+
# ${VAR_NAME}_MINOR -> the minor version
|
1124
|
+
# ${VAR_NAME}_PATCH -> the patch version
|
1125
|
+
#
|
1126
|
+
#=============================================================================#
|
1127
|
+
function(detect_arduino_version VAR_NAME)
|
1128
|
+
if(ARDUINO_VERSION_PATH)
|
1129
|
+
file(READ ${ARDUINO_VERSION_PATH} RAW_VERSION)
|
1130
|
+
if("${RAW_VERSION}" MATCHES " *[0]+([0-9]+)")
|
1131
|
+
set(PARSED_VERSION 0.${CMAKE_MATCH_1}.0)
|
1132
|
+
elseif("${RAW_VERSION}" MATCHES "[ ]*([0-9]+[.][0-9]+[.][0-9]+)")
|
1133
|
+
set(PARSED_VERSION ${CMAKE_MATCH_1})
|
1134
|
+
elseif("${RAW_VERSION}" MATCHES "[ ]*([0-9]+[.][0-9]+)")
|
1135
|
+
set(PARSED_VERSION ${CMAKE_MATCH_1}.0)
|
1136
|
+
endif()
|
1137
|
+
|
1138
|
+
if(NOT PARSED_VERSION STREQUAL "")
|
1139
|
+
string(REPLACE "." ";" SPLIT_VERSION ${PARSED_VERSION})
|
1140
|
+
list(GET SPLIT_VERSION 0 SPLIT_VERSION_MAJOR)
|
1141
|
+
list(GET SPLIT_VERSION 1 SPLIT_VERSION_MINOR)
|
1142
|
+
list(GET SPLIT_VERSION 2 SPLIT_VERSION_PATCH)
|
1143
|
+
|
1144
|
+
set(${VAR_NAME} "${PARSED_VERSION}" PARENT_SCOPE)
|
1145
|
+
set(${VAR_NAME}_MAJOR "${SPLIT_VERSION_MAJOR}" PARENT_SCOPE)
|
1146
|
+
set(${VAR_NAME}_MINOR "${SPLIT_VERSION_MINOR}" PARENT_SCOPE)
|
1147
|
+
set(${VAR_NAME}_PATCH "${SPLIT_VERSION_PATCH}" PARENT_SCOPE)
|
1148
|
+
endif()
|
1149
|
+
endif()
|
1150
|
+
endfunction()
|
1151
|
+
|
1152
|
+
|
1153
|
+
#=============================================================================#
|
1154
|
+
# [PRIVATE/INTERNAL]
|
1155
|
+
#
|
1156
|
+
# load_arduino_style_settings(SETTINGS_LIST SETTINGS_PATH)
|
1157
|
+
#
|
1158
|
+
# SETTINGS_LIST - Variable name of settings list
|
1159
|
+
# SETTINGS_PATH - File path of settings file to load.
|
1160
|
+
#
|
1161
|
+
# Load a Arduino style settings file into the cache.
|
1162
|
+
#
|
1163
|
+
# Examples of this type of settings file is the boards.txt and
|
1164
|
+
# programmers.txt files located in ${ARDUINO_SDK}/hardware/arduino.
|
1165
|
+
#
|
1166
|
+
# Settings have to following format:
|
1167
|
+
#
|
1168
|
+
# entry.setting[.subsetting] = value
|
1169
|
+
#
|
1170
|
+
# where [.subsetting] is optional
|
1171
|
+
#
|
1172
|
+
# For example, the following settings:
|
1173
|
+
#
|
1174
|
+
# uno.name=Arduino Uno
|
1175
|
+
# uno.upload.protocol=stk500
|
1176
|
+
# uno.upload.maximum_size=32256
|
1177
|
+
# uno.build.mcu=atmega328p
|
1178
|
+
# uno.build.core=arduino
|
1179
|
+
#
|
1180
|
+
# will generate the follwoing equivalent CMake variables:
|
1181
|
+
#
|
1182
|
+
# set(uno.name "Arduino Uno")
|
1183
|
+
# set(uno.upload.protocol "stk500")
|
1184
|
+
# set(uno.upload.maximum_size "32256")
|
1185
|
+
# set(uno.build.mcu "atmega328p")
|
1186
|
+
# set(uno.build.core "arduino")
|
1187
|
+
#
|
1188
|
+
# set(uno.SETTINGS name upload build) # List of settings for uno
|
1189
|
+
# set(uno.upload.SUBSETTINGS protocol maximum_size) # List of sub-settings for uno.upload
|
1190
|
+
# set(uno.build.SUBSETTINGS mcu core) # List of sub-settings for uno.build
|
1191
|
+
#
|
1192
|
+
# The ${ENTRY_NAME}.SETTINGS variable lists all settings for the entry, while
|
1193
|
+
# ${ENTRY_NAME}.SUBSETTINGS variables lists all settings for a sub-setting of
|
1194
|
+
# a entry setting pair.
|
1195
|
+
#
|
1196
|
+
# These variables are generated in order to be able to programatically traverse
|
1197
|
+
# all settings (for a example see print_board_settings() function).
|
1198
|
+
#
|
1199
|
+
#=============================================================================#
|
1200
|
+
function(LOAD_ARDUINO_STYLE_SETTINGS SETTINGS_LIST SETTINGS_PATH)
|
1201
|
+
|
1202
|
+
if(NOT ${SETTINGS_LIST} AND EXISTS ${SETTINGS_PATH})
|
1203
|
+
file(STRINGS ${SETTINGS_PATH} FILE_ENTRIES) # Settings file split into lines
|
1204
|
+
|
1205
|
+
foreach(FILE_ENTRY ${FILE_ENTRIES})
|
1206
|
+
if("${FILE_ENTRY}" MATCHES "^[^#]+=.*")
|
1207
|
+
string(REGEX MATCH "^[^=]+" SETTING_NAME ${FILE_ENTRY})
|
1208
|
+
string(REGEX MATCH "[^=]+$" SETTING_VALUE ${FILE_ENTRY})
|
1209
|
+
string(REPLACE "." ";" ENTRY_NAME_TOKENS ${SETTING_NAME})
|
1210
|
+
string(STRIP "${SETTING_VALUE}" SETTING_VALUE)
|
1211
|
+
|
1212
|
+
list(LENGTH ENTRY_NAME_TOKENS ENTRY_NAME_TOKENS_LEN)
|
1213
|
+
|
1214
|
+
# Add entry to settings list if it does not exist
|
1215
|
+
list(GET ENTRY_NAME_TOKENS 0 ENTRY_NAME)
|
1216
|
+
list(FIND ${SETTINGS_LIST} ${ENTRY_NAME} ENTRY_NAME_INDEX)
|
1217
|
+
if(ENTRY_NAME_INDEX LESS 0)
|
1218
|
+
# Add entry to main list
|
1219
|
+
list(APPEND ${SETTINGS_LIST} ${ENTRY_NAME})
|
1220
|
+
endif()
|
1221
|
+
|
1222
|
+
# Add entry setting to entry settings list if it does not exist
|
1223
|
+
set(ENTRY_SETTING_LIST ${ENTRY_NAME}.SETTINGS)
|
1224
|
+
list(GET ENTRY_NAME_TOKENS 1 ENTRY_SETTING)
|
1225
|
+
list(FIND ${ENTRY_SETTING_LIST} ${ENTRY_SETTING} ENTRY_SETTING_INDEX)
|
1226
|
+
if(ENTRY_SETTING_INDEX LESS 0)
|
1227
|
+
# Add setting to entry
|
1228
|
+
list(APPEND ${ENTRY_SETTING_LIST} ${ENTRY_SETTING})
|
1229
|
+
set(${ENTRY_SETTING_LIST} ${${ENTRY_SETTING_LIST}}
|
1230
|
+
CACHE INTERNAL "Arduino ${ENTRY_NAME} Board settings list")
|
1231
|
+
endif()
|
1232
|
+
|
1233
|
+
set(FULL_SETTING_NAME ${ENTRY_NAME}.${ENTRY_SETTING})
|
1234
|
+
|
1235
|
+
# Add entry sub-setting to entry sub-settings list if it does not exists
|
1236
|
+
if(ENTRY_NAME_TOKENS_LEN GREATER 2)
|
1237
|
+
set(ENTRY_SUBSETTING_LIST ${ENTRY_NAME}.${ENTRY_SETTING}.SUBSETTINGS)
|
1238
|
+
list(GET ENTRY_NAME_TOKENS 2 ENTRY_SUBSETTING)
|
1239
|
+
list(FIND ${ENTRY_SUBSETTING_LIST} ${ENTRY_SUBSETTING} ENTRY_SUBSETTING_INDEX)
|
1240
|
+
if(ENTRY_SUBSETTING_INDEX LESS 0)
|
1241
|
+
list(APPEND ${ENTRY_SUBSETTING_LIST} ${ENTRY_SUBSETTING})
|
1242
|
+
set(${ENTRY_SUBSETTING_LIST} ${${ENTRY_SUBSETTING_LIST}}
|
1243
|
+
CACHE INTERNAL "Arduino ${ENTRY_NAME} Board sub-settings list")
|
1244
|
+
endif()
|
1245
|
+
set(FULL_SETTING_NAME ${FULL_SETTING_NAME}.${ENTRY_SUBSETTING})
|
1246
|
+
endif()
|
1247
|
+
|
1248
|
+
# Save setting value
|
1249
|
+
set(${FULL_SETTING_NAME} ${SETTING_VALUE}
|
1250
|
+
CACHE INTERNAL "Arduino ${ENTRY_NAME} Board setting")
|
1251
|
+
|
1252
|
+
|
1253
|
+
endif()
|
1254
|
+
endforeach()
|
1255
|
+
set(${SETTINGS_LIST} ${${SETTINGS_LIST}}
|
1256
|
+
CACHE STRING "List of detected Arduino Board configurations")
|
1257
|
+
mark_as_advanced(${SETTINGS_LIST})
|
1258
|
+
endif()
|
1259
|
+
endfunction()
|
1260
|
+
|
1261
|
+
#=============================================================================#
|
1262
|
+
# print_settings(ENTRY_NAME)
|
1263
|
+
#
|
1264
|
+
# ENTRY_NAME - name of entry
|
1265
|
+
#
|
1266
|
+
# Print the entry settings (see load_arduino_syle_settings()).
|
1267
|
+
#
|
1268
|
+
#=============================================================================#
|
1269
|
+
function(PRINT_SETTINGS ENTRY_NAME)
|
1270
|
+
if(${ENTRY_NAME}.SETTINGS)
|
1271
|
+
|
1272
|
+
foreach(ENTRY_SETTING ${${ENTRY_NAME}.SETTINGS})
|
1273
|
+
if(${ENTRY_NAME}.${ENTRY_SETTING})
|
1274
|
+
message(STATUS " ${ENTRY_NAME}.${ENTRY_SETTING}=${${ENTRY_NAME}.${ENTRY_SETTING}}")
|
1275
|
+
endif()
|
1276
|
+
if(${ENTRY_NAME}.${ENTRY_SETTING}.SUBSETTINGS)
|
1277
|
+
foreach(ENTRY_SUBSETTING ${${ENTRY_NAME}.${ENTRY_SETTING}.SUBSETTINGS})
|
1278
|
+
if(${ENTRY_NAME}.${ENTRY_SETTING}.${ENTRY_SUBSETTING})
|
1279
|
+
message(STATUS " ${ENTRY_NAME}.${ENTRY_SETTING}.${ENTRY_SUBSETTING}=${${ENTRY_NAME}.${ENTRY_SETTING}.${ENTRY_SUBSETTING}}")
|
1280
|
+
endif()
|
1281
|
+
endforeach()
|
1282
|
+
endif()
|
1283
|
+
message(STATUS "")
|
1284
|
+
endforeach()
|
1285
|
+
endif()
|
1286
|
+
endfunction()
|
1287
|
+
|
1288
|
+
#=============================================================================#
|
1289
|
+
# [PRIVATE/INTERNAL]
|
1290
|
+
#
|
1291
|
+
# print_list(SETTINGS_LIST)
|
1292
|
+
#
|
1293
|
+
# SETTINGS_LIST - Variables name of settings list
|
1294
|
+
#
|
1295
|
+
# Print list settings and names (see load_arduino_syle_settings()).
|
1296
|
+
#=============================================================================#
|
1297
|
+
function(PRINT_LIST SETTINGS_LIST)
|
1298
|
+
if(${SETTINGS_LIST})
|
1299
|
+
set(MAX_LENGTH 0)
|
1300
|
+
foreach(ENTRY_NAME ${${SETTINGS_LIST}})
|
1301
|
+
string(LENGTH "${ENTRY_NAME}" CURRENT_LENGTH)
|
1302
|
+
if(CURRENT_LENGTH GREATER MAX_LENGTH)
|
1303
|
+
set(MAX_LENGTH ${CURRENT_LENGTH})
|
1304
|
+
endif()
|
1305
|
+
endforeach()
|
1306
|
+
foreach(ENTRY_NAME ${${SETTINGS_LIST}})
|
1307
|
+
string(LENGTH "${ENTRY_NAME}" CURRENT_LENGTH)
|
1308
|
+
math(EXPR PADDING_LENGTH "${MAX_LENGTH}-${CURRENT_LENGTH}")
|
1309
|
+
set(PADDING "")
|
1310
|
+
foreach(X RANGE ${PADDING_LENGTH})
|
1311
|
+
set(PADDING "${PADDING} ")
|
1312
|
+
endforeach()
|
1313
|
+
message(STATUS " ${PADDING}${ENTRY_NAME}: ${${ENTRY_NAME}.name}")
|
1314
|
+
endforeach()
|
1315
|
+
endif()
|
1316
|
+
endfunction()
|
1317
|
+
|
1318
|
+
#=============================================================================#
|
1319
|
+
# [PRIVATE/INTERNAL]
|
1320
|
+
#
|
1321
|
+
# setup_arduino_example(TARGET_NAME LIBRARY_NAME EXAMPLE_NAME OUTPUT_VAR)
|
1322
|
+
#
|
1323
|
+
# TARGET_NAME - Target name
|
1324
|
+
# LIBRARY_NAME - Library name
|
1325
|
+
# EXAMPLE_NAME - Example name
|
1326
|
+
# OUTPUT_VAR - Variable name to save sketch path.
|
1327
|
+
#
|
1328
|
+
# Creates a Arduino example from a the specified library.
|
1329
|
+
#=============================================================================#
|
1330
|
+
function(SETUP_ARDUINO_EXAMPLE TARGET_NAME LIBRARY_NAME EXAMPLE_NAME OUTPUT_VAR)
|
1331
|
+
set(EXAMPLE_SKETCH_PATH )
|
1332
|
+
|
1333
|
+
get_property(LIBRARY_SEARCH_PATH
|
1334
|
+
DIRECTORY # Property Scope
|
1335
|
+
PROPERTY LINK_DIRECTORIES)
|
1336
|
+
foreach(LIB_SEARCH_PATH ${LIBRARY_SEARCH_PATH} ${ARDUINO_LIBRARIES_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libraries)
|
1337
|
+
if(EXISTS "${LIB_SEARCH_PATH}/${LIBRARY_NAME}/examples/${EXAMPLE_NAME}")
|
1338
|
+
set(EXAMPLE_SKETCH_PATH "${LIB_SEARCH_PATH}/${LIBRARY_NAME}/examples/${EXAMPLE_NAME}")
|
1339
|
+
break()
|
1340
|
+
endif()
|
1341
|
+
endforeach()
|
1342
|
+
|
1343
|
+
if(EXAMPLE_SKETCH_PATH)
|
1344
|
+
setup_arduino_sketch(${TARGET_NAME} ${EXAMPLE_SKETCH_PATH} SKETCH_CPP)
|
1345
|
+
set("${OUTPUT_VAR}" ${${OUTPUT_VAR}} ${SKETCH_CPP} PARENT_SCOPE)
|
1346
|
+
else()
|
1347
|
+
message(FATAL_ERROR "Could not find example ${EXAMPLE_NAME} from library ${LIBRARY_NAME}")
|
1348
|
+
endif()
|
1349
|
+
endfunction()
|
1350
|
+
|
1351
|
+
#=============================================================================#
|
1352
|
+
# [PRIVATE/INTERNAL]
|
1353
|
+
#
|
1354
|
+
# setup_arduino_sketch(TARGET_NAME SKETCH_PATH OUTPUT_VAR)
|
1355
|
+
#
|
1356
|
+
# TARGET_NAME - Target name
|
1357
|
+
# SKETCH_PATH - Path to sketch directory
|
1358
|
+
# OUTPUT_VAR - Variable name where to save generated sketch source
|
1359
|
+
#
|
1360
|
+
# Generates C++ sources from Arduino Sketch.
|
1361
|
+
#=============================================================================#
|
1362
|
+
function(SETUP_ARDUINO_SKETCH TARGET_NAME SKETCH_PATH OUTPUT_VAR)
|
1363
|
+
get_filename_component(SKETCH_NAME "${SKETCH_PATH}" NAME)
|
1364
|
+
get_filename_component(SKETCH_PATH "${SKETCH_PATH}" ABSOLUTE)
|
1365
|
+
|
1366
|
+
if(EXISTS "${SKETCH_PATH}")
|
1367
|
+
set(SKETCH_CPP ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_${SKETCH_NAME}.cpp)
|
1368
|
+
|
1369
|
+
if (IS_DIRECTORY "${SKETCH_PATH}")
|
1370
|
+
# Sketch directory specified, try to find main sketch...
|
1371
|
+
set(MAIN_SKETCH ${SKETCH_PATH}/${SKETCH_NAME})
|
1372
|
+
|
1373
|
+
if(EXISTS "${MAIN_SKETCH}.pde")
|
1374
|
+
set(MAIN_SKETCH "${MAIN_SKETCH}.pde")
|
1375
|
+
elseif(EXISTS "${MAIN_SKETCH}.ino")
|
1376
|
+
set(MAIN_SKETCH "${MAIN_SKETCH}.ino")
|
1377
|
+
else()
|
1378
|
+
message(FATAL_ERROR "Could not find main sketch (${SKETCH_NAME}.pde or ${SKETCH_NAME}.ino) at ${SKETCH_PATH}! Please specify the main sketch file path instead of directory.")
|
1379
|
+
endif()
|
1380
|
+
else()
|
1381
|
+
# Sektch file specified, assuming parent directory as sketch directory
|
1382
|
+
set(MAIN_SKETCH ${SKETCH_PATH})
|
1383
|
+
get_filename_component(SKETCH_PATH "${SKETCH_PATH}" PATH)
|
1384
|
+
endif()
|
1385
|
+
arduino_debug_msg("sketch: ${MAIN_SKETCH}")
|
1386
|
+
|
1387
|
+
# Find all sketch files
|
1388
|
+
file(GLOB SKETCH_SOURCES ${SKETCH_PATH}/*.pde ${SKETCH_PATH}/*.ino)
|
1389
|
+
list(REMOVE_ITEM SKETCH_SOURCES ${MAIN_SKETCH})
|
1390
|
+
list(SORT SKETCH_SOURCES)
|
1391
|
+
|
1392
|
+
generate_cpp_from_sketch("${MAIN_SKETCH}" "${SKETCH_SOURCES}" "${SKETCH_CPP}")
|
1393
|
+
|
1394
|
+
# Regenerate build system if sketch changes
|
1395
|
+
add_custom_command(OUTPUT ${SKETCH_CPP}
|
1396
|
+
COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}
|
1397
|
+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
1398
|
+
DEPENDS ${MAIN_SKETCH} ${SKETCH_SOURCES}
|
1399
|
+
COMMENT "Regnerating ${SKETCH_NAME} Sketch")
|
1400
|
+
set_source_files_properties(${SKETCH_CPP} PROPERTIES GENERATED TRUE)
|
1401
|
+
|
1402
|
+
set("${OUTPUT_VAR}" ${${OUTPUT_VAR}} ${SKETCH_CPP} PARENT_SCOPE)
|
1403
|
+
else()
|
1404
|
+
message(FATAL_ERROR "Sketch does not exist: ${SKETCH_PATH}")
|
1405
|
+
endif()
|
1406
|
+
endfunction()
|
1407
|
+
|
1408
|
+
|
1409
|
+
#=============================================================================#
|
1410
|
+
# [PRIVATE/INTERNAL]
|
1411
|
+
#
|
1412
|
+
# generate_cpp_from_sketch(MAIN_SKETCH_PATH SKETCH_SOURCES SKETCH_CPP)
|
1413
|
+
#
|
1414
|
+
# MAIN_SKETCH_PATH - Main sketch file path
|
1415
|
+
# SKETCH_SOURCES - Setch source paths
|
1416
|
+
# SKETCH_CPP - Name of file to generate
|
1417
|
+
#
|
1418
|
+
# Generate C++ source file from Arduino sketch files.
|
1419
|
+
#=============================================================================#
|
1420
|
+
function(GENERATE_CPP_FROM_SKETCH MAIN_SKETCH_PATH SKETCH_SOURCES SKETCH_CPP)
|
1421
|
+
file(WRITE ${SKETCH_CPP} "// automatically generated by arduino-cmake\n")
|
1422
|
+
file(READ ${MAIN_SKETCH_PATH} MAIN_SKETCH)
|
1423
|
+
|
1424
|
+
# remove comments
|
1425
|
+
remove_comments(MAIN_SKETCH MAIN_SKETCH_NO_COMMENTS)
|
1426
|
+
|
1427
|
+
# find first statement
|
1428
|
+
string(REGEX MATCH "[\n][_a-zA-Z0-9]+[^\n]*" FIRST_STATEMENT "${MAIN_SKETCH_NO_COMMENTS}")
|
1429
|
+
string(FIND "${MAIN_SKETCH}" "${FIRST_STATEMENT}" HEAD_LENGTH)
|
1430
|
+
if ("${HEAD_LENGTH}" STREQUAL "-1")
|
1431
|
+
set(HEAD_LENGTH 0)
|
1432
|
+
endif()
|
1433
|
+
#message(STATUS "FIRST STATEMENT: ${FIRST_STATEMENT}")
|
1434
|
+
#message(STATUS "FIRST STATEMENT POSITION: ${HEAD_LENGTH}")
|
1435
|
+
string(LENGTH "${MAIN_SKETCH}" MAIN_SKETCH_LENGTH)
|
1436
|
+
|
1437
|
+
string(SUBSTRING "${MAIN_SKETCH}" 0 ${HEAD_LENGTH} SKETCH_HEAD)
|
1438
|
+
#arduino_debug_msg("SKETCH_HEAD:\n${SKETCH_HEAD}")
|
1439
|
+
|
1440
|
+
# find the body of the main pde
|
1441
|
+
math(EXPR BODY_LENGTH "${MAIN_SKETCH_LENGTH}-${HEAD_LENGTH}")
|
1442
|
+
string(SUBSTRING "${MAIN_SKETCH}" "${HEAD_LENGTH}+1" "${BODY_LENGTH}-1" SKETCH_BODY)
|
1443
|
+
#arduino_debug_msg("BODY:\n${SKETCH_BODY}")
|
1444
|
+
|
1445
|
+
# write the file head
|
1446
|
+
file(APPEND ${SKETCH_CPP} "#line 1 \"${MAIN_SKETCH_PATH}\"\n${SKETCH_HEAD}")
|
1447
|
+
|
1448
|
+
# Count head line offset (for GCC error reporting)
|
1449
|
+
file(STRINGS ${SKETCH_CPP} SKETCH_HEAD_LINES)
|
1450
|
+
list(LENGTH SKETCH_HEAD_LINES SKETCH_HEAD_LINES_COUNT)
|
1451
|
+
math(EXPR SKETCH_HEAD_OFFSET "${SKETCH_HEAD_LINES_COUNT}+2")
|
1452
|
+
|
1453
|
+
# add arduino include header
|
1454
|
+
#file(APPEND ${SKETCH_CPP} "\n#line 1 \"autogenerated\"\n")
|
1455
|
+
file(APPEND ${SKETCH_CPP} "\n#line ${SKETCH_HEAD_OFFSET} \"${SKETCH_CPP}\"\n")
|
1456
|
+
if(ARDUINO_SDK_VERSION VERSION_LESS 1.0)
|
1457
|
+
file(APPEND ${SKETCH_CPP} "#include \"WProgram.h\"\n")
|
1458
|
+
else()
|
1459
|
+
file(APPEND ${SKETCH_CPP} "#include \"Arduino.h\"\n")
|
1460
|
+
endif()
|
1461
|
+
|
1462
|
+
# add function prototypes
|
1463
|
+
foreach(SKETCH_SOURCE_PATH ${SKETCH_SOURCES} ${MAIN_SKETCH_PATH})
|
1464
|
+
arduino_debug_msg("Sketch: ${SKETCH_SOURCE_PATH}")
|
1465
|
+
file(READ ${SKETCH_SOURCE_PATH} SKETCH_SOURCE)
|
1466
|
+
remove_comments(SKETCH_SOURCE SKETCH_SOURCE)
|
1467
|
+
|
1468
|
+
set(ALPHA "a-zA-Z")
|
1469
|
+
set(NUM "0-9")
|
1470
|
+
set(ALPHANUM "${ALPHA}${NUM}")
|
1471
|
+
set(WORD "_${ALPHANUM}")
|
1472
|
+
set(LINE_START "(^|[\n])")
|
1473
|
+
set(QUALIFIERS "[ \t]*([${ALPHA}]+[ ])*")
|
1474
|
+
set(TYPE "[${WORD}]+([ ]*[\n][\t]*|[ ])+")
|
1475
|
+
set(FNAME "[${WORD}]+[ ]?[\n]?[\t]*[ ]*")
|
1476
|
+
set(FARGS "[(]([\t]*[ ]*[*&]?[ ]?[${WORD}](\\[([${NUM}]+)?\\])*[,]?[ ]*[\n]?)*([,]?[ ]*[\n]?)?[)]")
|
1477
|
+
set(BODY_START "([ ]*[\n][\t]*|[ ]|[\n])*{")
|
1478
|
+
set(PROTOTYPE_PATTERN "${LINE_START}${QUALIFIERS}${TYPE}${FNAME}${FARGS}${BODY_START}")
|
1479
|
+
|
1480
|
+
string(REGEX MATCHALL "${PROTOTYPE_PATTERN}" SKETCH_PROTOTYPES "${SKETCH_SOURCE}")
|
1481
|
+
|
1482
|
+
# Write function prototypes
|
1483
|
+
file(APPEND ${SKETCH_CPP} "\n//=== START Forward: ${SKETCH_SOURCE_PATH}\n")
|
1484
|
+
foreach(SKETCH_PROTOTYPE ${SKETCH_PROTOTYPES})
|
1485
|
+
string(REPLACE "\n" " " SKETCH_PROTOTYPE "${SKETCH_PROTOTYPE}")
|
1486
|
+
string(REPLACE "{" "" SKETCH_PROTOTYPE "${SKETCH_PROTOTYPE}")
|
1487
|
+
arduino_debug_msg("\tprototype: ${SKETCH_PROTOTYPE};")
|
1488
|
+
# " else if(var == other) {" shoudn't be listed as prototype
|
1489
|
+
if(NOT SKETCH_PROTOTYPE MATCHES "(if[ ]?[\n]?[\t]*[ ]*[)])")
|
1490
|
+
file(APPEND ${SKETCH_CPP} "${SKETCH_PROTOTYPE};\n")
|
1491
|
+
else()
|
1492
|
+
arduino_debug_msg("\trejected prototype: ${SKETCH_PROTOTYPE};")
|
1493
|
+
endif()
|
1494
|
+
file(APPEND ${SKETCH_CPP} "${SKETCH_PROTOTYPE};\n")
|
1495
|
+
endforeach()
|
1496
|
+
file(APPEND ${SKETCH_CPP} "//=== END Forward: ${SKETCH_SOURCE_PATH}\n")
|
1497
|
+
endforeach()
|
1498
|
+
|
1499
|
+
# Write Sketch CPP source
|
1500
|
+
get_num_lines("${SKETCH_HEAD}" HEAD_NUM_LINES)
|
1501
|
+
file(APPEND ${SKETCH_CPP} "#line ${HEAD_NUM_LINES} \"${MAIN_SKETCH_PATH}\"\n")
|
1502
|
+
file(APPEND ${SKETCH_CPP} "\n${SKETCH_BODY}")
|
1503
|
+
foreach (SKETCH_SOURCE_PATH ${SKETCH_SOURCES})
|
1504
|
+
file(READ ${SKETCH_SOURCE_PATH} SKETCH_SOURCE)
|
1505
|
+
file(APPEND ${SKETCH_CPP} "\n//=== START : ${SKETCH_SOURCE_PATH}\n")
|
1506
|
+
file(APPEND ${SKETCH_CPP} "#line 1 \"${SKETCH_SOURCE_PATH}\"\n")
|
1507
|
+
file(APPEND ${SKETCH_CPP} "${SKETCH_SOURCE}")
|
1508
|
+
file(APPEND ${SKETCH_CPP} "\n//=== END : ${SKETCH_SOURCE_PATH}\n")
|
1509
|
+
endforeach()
|
1510
|
+
endfunction()
|
1511
|
+
|
1512
|
+
#=============================================================================#
|
1513
|
+
# [PRIVATE/INTERNAL]
|
1514
|
+
#
|
1515
|
+
# setup_arduino_size_script(OUTPUT_VAR)
|
1516
|
+
#
|
1517
|
+
# OUTPUT_VAR - Output variable that will contain the script path
|
1518
|
+
#
|
1519
|
+
# Generates script used to display the firmware size.
|
1520
|
+
#=============================================================================#
|
1521
|
+
function(SETUP_ARDUINO_SIZE_SCRIPT OUTPUT_VAR)
|
1522
|
+
set(ARDUINO_SIZE_SCRIPT_PATH ${CMAKE_BINARY_DIR}/CMakeFiles/FirmwareSize.cmake)
|
1523
|
+
|
1524
|
+
file(WRITE ${ARDUINO_SIZE_SCRIPT_PATH} "
|
1525
|
+
set(AVRSIZE_PROGRAM ${AVRSIZE_PROGRAM})
|
1526
|
+
set(AVRSIZE_FLAGS --target=ihex -d)
|
1527
|
+
|
1528
|
+
execute_process(COMMAND \${AVRSIZE_PROGRAM} \${AVRSIZE_FLAGS} \${FIRMWARE_IMAGE}
|
1529
|
+
OUTPUT_VARIABLE SIZE_OUTPUT)
|
1530
|
+
|
1531
|
+
string(STRIP \"\${SIZE_OUTPUT}\" SIZE_OUTPUT)
|
1532
|
+
|
1533
|
+
# Convert lines into a list
|
1534
|
+
string(REPLACE \"\\n\" \";\" SIZE_OUTPUT \"\${SIZE_OUTPUT}\")
|
1535
|
+
|
1536
|
+
list(GET SIZE_OUTPUT 1 SIZE_ROW)
|
1537
|
+
|
1538
|
+
if(SIZE_ROW MATCHES \"[ \\t]*[0-9]+[ \\t]*[0-9]+[ \\t]*[0-9]+[ \\t]*([0-9]+)[ \\t]*([0-9a-fA-F]+).*\")
|
1539
|
+
message(\"Total size \${CMAKE_MATCH_1} bytes\")
|
1540
|
+
endif()")
|
1541
|
+
|
1542
|
+
set(${OUTPUT_VAR} ${ARDUINO_SIZE_SCRIPT_PATH} PARENT_SCOPE)
|
1543
|
+
endfunction()
|
1544
|
+
|
1545
|
+
#=============================================================================#
|
1546
|
+
# [PRIVATE/INTERNAL]
|
1547
|
+
#
|
1548
|
+
# arduino_debug_on()
|
1549
|
+
#
|
1550
|
+
# Enables Arduino module debugging.
|
1551
|
+
#=============================================================================#
|
1552
|
+
function(ARDUINO_DEBUG_ON)
|
1553
|
+
set(ARDUINO_DEBUG True PARENT_SCOPE)
|
1554
|
+
endfunction()
|
1555
|
+
|
1556
|
+
|
1557
|
+
#=============================================================================#
|
1558
|
+
# [PRIVATE/INTERNAL]
|
1559
|
+
#
|
1560
|
+
# arduino_debug_off()
|
1561
|
+
#
|
1562
|
+
# Disables Arduino module debugging.
|
1563
|
+
#=============================================================================#
|
1564
|
+
function(ARDUINO_DEBUG_OFF)
|
1565
|
+
set(ARDUINO_DEBUG False PARENT_SCOPE)
|
1566
|
+
endfunction()
|
1567
|
+
|
1568
|
+
|
1569
|
+
#=============================================================================#
|
1570
|
+
# [PRIVATE/INTERNAL]
|
1571
|
+
#
|
1572
|
+
# arduino_debug_msg(MSG)
|
1573
|
+
#
|
1574
|
+
# MSG - Message to print
|
1575
|
+
#
|
1576
|
+
# Print Arduino debugging information. In order to enable printing
|
1577
|
+
# use arduino_debug_on() and to disable use arduino_debug_off().
|
1578
|
+
#=============================================================================#
|
1579
|
+
function(ARDUINO_DEBUG_MSG MSG)
|
1580
|
+
if(ARDUINO_DEBUG)
|
1581
|
+
message("## ${MSG}")
|
1582
|
+
endif()
|
1583
|
+
endfunction()
|
1584
|
+
|
1585
|
+
#=============================================================================#
|
1586
|
+
# [PRIVATE/INTERNAL]
|
1587
|
+
#
|
1588
|
+
# remove_comments(SRC_VAR OUT_VAR)
|
1589
|
+
#
|
1590
|
+
# SRC_VAR - variable holding sources
|
1591
|
+
# OUT_VAR - variable holding sources with no comments
|
1592
|
+
#
|
1593
|
+
# Removes all comments from the source code.
|
1594
|
+
#=============================================================================#
|
1595
|
+
function(REMOVE_COMMENTS SRC_VAR OUT_VAR)
|
1596
|
+
string(REGEX REPLACE "[\\./\\\\]" "_" FILE "${NAME}")
|
1597
|
+
|
1598
|
+
set(SRC ${${SRC_VAR}})
|
1599
|
+
|
1600
|
+
#message(STATUS "removing comments from: ${FILE}")
|
1601
|
+
#file(WRITE "${CMAKE_BINARY_DIR}/${FILE}_pre_remove_comments.txt" ${SRC})
|
1602
|
+
#message(STATUS "\n${SRC}")
|
1603
|
+
|
1604
|
+
# remove all comments
|
1605
|
+
string(REGEX REPLACE "([/][/][^\n]*)|([/][\\*]([^\\*]|([\\*]+[^/\\*]))*[\\*]+[/])" "" OUT "${SRC}")
|
1606
|
+
|
1607
|
+
#file(WRITE "${CMAKE_BINARY_DIR}/${FILE}_post_remove_comments.txt" ${SRC})
|
1608
|
+
#message(STATUS "\n${SRC}")
|
1609
|
+
|
1610
|
+
set(${OUT_VAR} ${OUT} PARENT_SCOPE)
|
1611
|
+
|
1612
|
+
endfunction()
|
1613
|
+
|
1614
|
+
#=============================================================================#
|
1615
|
+
# [PRIVATE/INTERNAL]
|
1616
|
+
#
|
1617
|
+
# get_num_lines(DOCUMENT OUTPUT_VAR)
|
1618
|
+
#
|
1619
|
+
# DOCUMENT - Document contents
|
1620
|
+
# OUTPUT_VAR - Variable which will hold the line number count
|
1621
|
+
#
|
1622
|
+
# Counts the line number of the document.
|
1623
|
+
#=============================================================================#
|
1624
|
+
function(GET_NUM_LINES DOCUMENT OUTPUT_VAR)
|
1625
|
+
string(REGEX MATCHALL "[\n]" MATCH_LIST "${DOCUMENT}")
|
1626
|
+
list(LENGTH MATCH_LIST NUM)
|
1627
|
+
set(${OUTPUT_VAR} ${NUM} PARENT_SCOPE)
|
1628
|
+
endfunction()
|
1629
|
+
|
1630
|
+
#=============================================================================#
|
1631
|
+
# [PRIVATE/INTERNAL]
|
1632
|
+
#
|
1633
|
+
# required_variables(MSG msg VARS var1 var2 .. varN)
|
1634
|
+
#
|
1635
|
+
# MSG - Message to be displayed in case of error
|
1636
|
+
# VARS - List of variables names to check
|
1637
|
+
#
|
1638
|
+
# Ensure the specified variables are not empty, otherwise a fatal error is emmited.
|
1639
|
+
#=============================================================================#
|
1640
|
+
function(REQUIRED_VARIABLES)
|
1641
|
+
cmake_parse_arguments(INPUT "" "MSG" "VARS" ${ARGN})
|
1642
|
+
error_for_unparsed(INPUT)
|
1643
|
+
foreach(VAR ${INPUT_VARS})
|
1644
|
+
if ("${${VAR}}" STREQUAL "")
|
1645
|
+
message(FATAL_ERROR "${VAR} not set: ${INPUT_MSG}")
|
1646
|
+
endif()
|
1647
|
+
endforeach()
|
1648
|
+
endfunction()
|
1649
|
+
|
1650
|
+
#=============================================================================#
|
1651
|
+
# [PRIVATE/INTERNAL]
|
1652
|
+
#
|
1653
|
+
# error_for_unparsed(PREFIX)
|
1654
|
+
#
|
1655
|
+
# PREFIX - Prefix name
|
1656
|
+
#
|
1657
|
+
# Emit fatal error if there are unparsed argument from cmake_parse_arguments().
|
1658
|
+
#=============================================================================#
|
1659
|
+
function(ERROR_FOR_UNPARSED PREFIX)
|
1660
|
+
set(ARGS "${${PREFIX}_UNPARSED_ARGUMENTS}")
|
1661
|
+
if (NOT ( "${ARGS}" STREQUAL "") )
|
1662
|
+
message(FATAL_ERROR "unparsed argument: ${ARGS}")
|
1663
|
+
endif()
|
1664
|
+
endfunction()
|
1665
|
+
|
1666
|
+
|
1667
|
+
|
1668
|
+
|
1669
|
+
|
1670
|
+
|
1671
|
+
#=============================================================================#
|
1672
|
+
# C Flags
|
1673
|
+
#=============================================================================#
|
1674
|
+
set(ARDUINO_C_FLAGS "-mcall-prologues -ffunction-sections -fdata-sections")
|
1675
|
+
set(CMAKE_C_FLAGS "-g -Os ${ARDUINO_C_FLAGS}" CACHE STRING "")
|
1676
|
+
set(CMAKE_C_FLAGS_DEBUG "-g ${ARDUINO_C_FLAGS}" CACHE STRING "")
|
1677
|
+
set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG ${ARDUINO_C_FLAGS}" CACHE STRING "")
|
1678
|
+
set(CMAKE_C_FLAGS_RELEASE "-Os -DNDEBUG -w ${ARDUINO_C_FLAGS}" CACHE STRING "")
|
1679
|
+
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Os -g -w ${ARDUINO_C_FLAGS}" CACHE STRING "")
|
1680
|
+
|
1681
|
+
#=============================================================================#
|
1682
|
+
# C++ Flags
|
1683
|
+
#=============================================================================#
|
1684
|
+
set(ARDUINO_CXX_FLAGS "${ARDUINO_C_FLAGS} -fno-exceptions")
|
1685
|
+
set(CMAKE_CXX_FLAGS "-g -Os ${ARDUINO_CXX_FLAGS}" CACHE STRING "")
|
1686
|
+
set(CMAKE_CXX_FLAGS_DEBUG "-g ${ARDUINO_CXX_FLAGS}" CACHE STRING "")
|
1687
|
+
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG ${ARDUINO_CXX_FLAGS}" CACHE STRING "")
|
1688
|
+
set(CMAKE_CXX_FLAGS_RELEASE "-Os -DNDEBUG ${ARDUINO_CXX_FLAGS}" CACHE STRING "")
|
1689
|
+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Os -g ${ARDUINO_CXX_FLAGS}" CACHE STRING "")
|
1690
|
+
|
1691
|
+
#=============================================================================#
|
1692
|
+
# Executable Linker Flags #
|
1693
|
+
#=============================================================================#
|
1694
|
+
set(ARDUINO_LINKER_FLAGS "-Wl,--gc-sections -lm")
|
1695
|
+
set(CMAKE_EXE_LINKER_FLAGS "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1696
|
+
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1697
|
+
set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1698
|
+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1699
|
+
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1700
|
+
|
1701
|
+
#=============================================================================#
|
1702
|
+
#=============================================================================#
|
1703
|
+
# Shared Lbrary Linker Flags #
|
1704
|
+
#=============================================================================#
|
1705
|
+
set(CMAKE_SHARED_LINKER_FLAGS "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1706
|
+
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1707
|
+
set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1708
|
+
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1709
|
+
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1710
|
+
|
1711
|
+
set(CMAKE_MODULE_LINKER_FLAGS "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1712
|
+
set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1713
|
+
set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1714
|
+
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1715
|
+
set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${ARDUINO_LINKER_FLAGS}" CACHE STRING "")
|
1716
|
+
|
1717
|
+
|
1718
|
+
#=============================================================================#
|
1719
|
+
# Arduino Settings
|
1720
|
+
#=============================================================================#
|
1721
|
+
set(ARDUINO_OBJCOPY_EEP_FLAGS -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load
|
1722
|
+
--no-change-warnings --change-section-lma .eeprom=0 CACHE STRING "")
|
1723
|
+
set(ARDUINO_OBJCOPY_HEX_FLAGS -O ihex -R .eeprom CACHE STRING "")
|
1724
|
+
set(ARDUINO_AVRDUDE_FLAGS -V CACHE STRING "")
|
1725
|
+
|
1726
|
+
#=============================================================================#
|
1727
|
+
# Initialization
|
1728
|
+
#=============================================================================#
|
1729
|
+
if(NOT ARDUINO_FOUND AND ARDUINO_SDK_PATH)
|
1730
|
+
find_file(ARDUINO_CORES_PATH
|
1731
|
+
NAMES cores
|
1732
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1733
|
+
PATH_SUFFIXES hardware/arduino
|
1734
|
+
DOC "Path to directory containing the Arduino core sources.")
|
1735
|
+
|
1736
|
+
find_file(ARDUINO_VARIANTS_PATH
|
1737
|
+
NAMES variants
|
1738
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1739
|
+
PATH_SUFFIXES hardware/arduino
|
1740
|
+
DOC "Path to directory containing the Arduino variant sources.")
|
1741
|
+
|
1742
|
+
find_file(ARDUINO_BOOTLOADERS_PATH
|
1743
|
+
NAMES bootloaders
|
1744
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1745
|
+
PATH_SUFFIXES hardware/arduino
|
1746
|
+
DOC "Path to directory containing the Arduino bootloader images and sources.")
|
1747
|
+
|
1748
|
+
find_file(ARDUINO_LIBRARIES_PATH
|
1749
|
+
NAMES libraries
|
1750
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1751
|
+
DOC "Path to directory containing the Arduino libraries.")
|
1752
|
+
|
1753
|
+
find_file(ARDUINO_BOARDS_PATH
|
1754
|
+
NAMES boards.txt
|
1755
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1756
|
+
PATH_SUFFIXES hardware/arduino
|
1757
|
+
DOC "Path to Arduino boards definition file.")
|
1758
|
+
|
1759
|
+
find_file(ARDUINO_PROGRAMMERS_PATH
|
1760
|
+
NAMES programmers.txt
|
1761
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1762
|
+
PATH_SUFFIXES hardware/arduino
|
1763
|
+
DOC "Path to Arduino programmers definition file.")
|
1764
|
+
|
1765
|
+
find_file(ARDUINO_VERSION_PATH
|
1766
|
+
NAMES lib/version.txt
|
1767
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1768
|
+
DOC "Path to Arduino version file.")
|
1769
|
+
|
1770
|
+
find_program(ARDUINO_AVRDUDE_PROGRAM
|
1771
|
+
NAMES avrdude
|
1772
|
+
PATHS ${ARDUINO_SDK_PATH}
|
1773
|
+
PATH_SUFFIXES hardware/tools
|
1774
|
+
NO_DEFAULT_PATH)
|
1775
|
+
|
1776
|
+
find_program(ARDUINO_AVRDUDE_PROGRAM
|
1777
|
+
NAMES avrdude
|
1778
|
+
DOC "Path to avrdude programmer binary.")
|
1779
|
+
|
1780
|
+
find_program(AVRSIZE_PROGRAM
|
1781
|
+
NAMES avr-size)
|
1782
|
+
|
1783
|
+
find_file(ARDUINO_AVRDUDE_CONFIG_PATH
|
1784
|
+
NAMES avrdude.conf
|
1785
|
+
PATHS ${ARDUINO_SDK_PATH} /etc/avrdude
|
1786
|
+
PATH_SUFFIXES hardware/tools
|
1787
|
+
hardware/tools/avr/etc
|
1788
|
+
DOC "Path to avrdude programmer configuration file.")
|
1789
|
+
|
1790
|
+
set(ARDUINO_DEFAULT_BOARD uno CACHE STRING "Default Arduino Board ID when not specified.")
|
1791
|
+
set(ARDUINO_DEFAULT_PORT CACHE STRING "Default Arduino port when not specified.")
|
1792
|
+
set(ARDUINO_DEFAULT_SERIAL CACHE STRING "Default Arduino Serial command when not specified.")
|
1793
|
+
set(ARDUINO_DEFAULT_PROGRAMMER CACHE STRING "Default Arduino Programmer ID when not specified.")
|
1794
|
+
|
1795
|
+
# Ensure that all required paths are found
|
1796
|
+
required_variables(VARS
|
1797
|
+
ARDUINO_CORES_PATH
|
1798
|
+
ARDUINO_BOOTLOADERS_PATH
|
1799
|
+
ARDUINO_LIBRARIES_PATH
|
1800
|
+
ARDUINO_BOARDS_PATH
|
1801
|
+
ARDUINO_PROGRAMMERS_PATH
|
1802
|
+
ARDUINO_VERSION_PATH
|
1803
|
+
ARDUINO_AVRDUDE_FLAGS
|
1804
|
+
ARDUINO_AVRDUDE_PROGRAM
|
1805
|
+
ARDUINO_AVRDUDE_CONFIG_PATH
|
1806
|
+
AVRSIZE_PROGRAM
|
1807
|
+
MSG "Invalid Arduino SDK path (${ARDUINO_SDK_PATH}).\n")
|
1808
|
+
|
1809
|
+
detect_arduino_version(ARDUINO_SDK_VERSION)
|
1810
|
+
set(ARDUINO_SDK_VERSION ${ARDUINO_SDK_VERSION} CACHE STRING "Arduino SDK Version")
|
1811
|
+
set(ARDUINO_SDK_VERSION_MAJOR ${ARDUINO_SDK_VERSION_MAJOR} CACHE STRING "Arduino SDK Major Version")
|
1812
|
+
set(ARDUINO_SDK_VERSION_MINOR ${ARDUINO_SDK_VERSION_MINOR} CACHE STRING "Arduino SDK Minor Version")
|
1813
|
+
set(ARDUINO_SDK_VERSION_PATCH ${ARDUINO_SDK_VERSION_PATCH} CACHE STRING "Arduino SDK Patch Version")
|
1814
|
+
|
1815
|
+
if(ARDUINO_SDK_VERSION VERSION_LESS 0.19)
|
1816
|
+
message(FATAL_ERROR "Unsupported Arduino SDK (require verion 0.19 or higher)")
|
1817
|
+
endif()
|
1818
|
+
|
1819
|
+
message(STATUS "Arduino SDK version ${ARDUINO_SDK_VERSION}: ${ARDUINO_SDK_PATH}")
|
1820
|
+
|
1821
|
+
setup_arduino_size_script(ARDUINO_SIZE_SCRIPT)
|
1822
|
+
set(ARDUINO_SIZE_SCRIPT ${ARDUINO_SIZE_SCRIPT} CACHE INTERNAL "Arduino Size Script")
|
1823
|
+
|
1824
|
+
load_board_settings()
|
1825
|
+
load_programmers_settings()
|
1826
|
+
|
1827
|
+
#print_board_list()
|
1828
|
+
#print_programmer_list()
|
1829
|
+
|
1830
|
+
set(ARDUINO_FOUND True CACHE INTERNAL "Arduino Found")
|
1831
|
+
mark_as_advanced(
|
1832
|
+
ARDUINO_CORES_PATH
|
1833
|
+
ARDUINO_VARIANTS_PATH
|
1834
|
+
ARDUINO_BOOTLOADERS_PATH
|
1835
|
+
ARDUINO_LIBRARIES_PATH
|
1836
|
+
ARDUINO_BOARDS_PATH
|
1837
|
+
ARDUINO_PROGRAMMERS_PATH
|
1838
|
+
ARDUINO_VERSION_PATH
|
1839
|
+
ARDUINO_AVRDUDE_FLAGS
|
1840
|
+
ARDUINO_AVRDUDE_PROGRAM
|
1841
|
+
ARDUINO_AVRDUDE_CONFIG_PATH
|
1842
|
+
ARDUINO_OBJCOPY_EEP_FLAGS
|
1843
|
+
ARDUINO_OBJCOPY_HEX_FLAGS
|
1844
|
+
AVRSIZE_PROGRAM)
|
1845
|
+
endif()
|
1846
|
+
|