class EmbedUtils::RakeTask
Constants
- AR
- ARDUINO_DIR
- BUILD_DIR
- CC
- CXX
- CXXFLAGS
- ELF_FILE
- HEX_FILE
- LIBRARIES
- LIBRARIES_DIR
- LIBS_ARCHIVE
- OBJCOPY
- PORT
FIXME: for default one, sort /dev/cuaU? by date and pick last one
- SIZE
- SRC_DIR
Attributes
arduino_dir[RW]
board[R]
libraries[RW]
libs_archive[RW]
options[RW]
src_dir[RW]
Public Class Methods
new() { |self| ... }
click to toggle source
# File lib/embed_utils/rake_task.rb, line 37 def initialize @board = Board[:uno] @libs_archive = LIBS_ARCHIVE @libraries = LIBRARIES @src_dir = SRC_DIR @arduino_dir = ARDUINO_DIR @options = [*ENV['OPTIONS']&.split].compact yield self if block_given? define end
Public Instance Methods
board=(identifier)
click to toggle source
# File lib/embed_utils/rake_task.rb, line 48 def board= identifier @board = Board[identifier] end
Private Instance Methods
cpp_flags()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 127 def cpp_flags %W[ -MMD -mmcu=#{board.mcu} -Wall -ffunction-sections -fdata-sections -Os ] end
define()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 54 def define file HEX_FILE => ELF_FILE do |t| sh "#{SIZE} #{ELF_FILE}" sh "#{OBJCOPY} -O ihex -R .eeprom #{ELF_FILE} #{t.name}" end file ELF_FILE => [*objs, libs_archive] do |t| sh "#{CC} #{linker_flags} -o #{t.name} #{t.prerequisites.join ' '}" end file libs_archive => libs_objs do |t| sh "#{AR} rcs #{t.name} #{t.sources.join ' '}" end libs.each do |lib| directory lib_build_dir lib end rule '.o' => [obj_to_src, *libs_build_dirs] do |t| args = [*cpp_flags, *board.predefines, *includes, *options].compact if t.source.pathmap('%x') == '.c' sh "#{CC} #{args.join ' '} #{t.source} -c -o #{t.name}" else args += CXXFLAGS sh "#{CXX} #{args.join ' '} #{t.source} -c -o #{t.name}" end end desc 'Build the hex file' task hex: HEX_FILE desc 'Install program on USB board' task install: :hex do sh "avrdude -V -p #{board.avr_mcu} -D -c #{board.avr_programmer}" \ " -P #{PORT} -b #{board.upload_speed} -U flash:w:#{HEX_FILE}:i" end desc 'Remove build directory' task :clean do rm_rf BUILD_DIR end end
includes()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 113 def includes %W[ -Iinclude -I#{arduino_dir}/hardware/arduino/avr/cores/arduino -I#{arduino_dir}/hardware/arduino/avr/variants/#{board.variant} ] + libs.select { |lib| lib != 'arduino' }.map do |lib| "-I#{lib_include_dir lib}" end end
lib_build_dir(lib)
click to toggle source
# File lib/embed_utils/rake_task.rb, line 150 def lib_build_dir lib "#{BUILD_DIR}/#{lib}" end
lib_include_dir(lib)
click to toggle source
# File lib/embed_utils/rake_task.rb, line 166 def lib_include_dir lib %W[ #{LIBRARIES_DIR}/#{lib} #{arduino_dir}/libraries/#{lib}/src #{arduino_dir}/hardware/arduino/avr/libraries/#{lib} ].find do |lib_dir| Dir.exist? lib_dir end end
lib_objs(lib)
click to toggle source
# File lib/embed_utils/rake_task.rb, line 154 def lib_objs lib lib_srcs(lib).pathmap "%{^#{lib_src_dir lib},#{BUILD_DIR}/#{lib}}X.o" end
lib_src_dir(lib)
click to toggle source
# File lib/embed_utils/rake_task.rb, line 176 def lib_src_dir lib case lib when 'arduino' "#{arduino_dir}/hardware/arduino/avr/cores/arduino" else %W[ #{LIBRARIES_DIR}/#{lib} #{arduino_dir}/libraries/#{lib}/src/avr #{arduino_dir}/libraries/#{lib}/src #{arduino_dir}/hardware/arduino/avr/libraries/#{lib} ].find do |lib_dir| Dir.exist? lib_dir end end end
lib_srcs(lib)
click to toggle source
# File lib/embed_utils/rake_task.rb, line 158 def lib_srcs lib [ FileList["#{lib_src_dir lib}/*.c"], FileList["#{lib_src_dir lib}/*.cpp"], FileList["#{lib_src_dir lib}/*.S"] ].inject :+ end
libs()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 134 def libs libraries end
libs_build_dirs()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 144 def libs_build_dirs libs.map do |lib| lib_build_dir lib end end
libs_objs()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 138 def libs_objs libs.inject [] do |m, lib| m + lib_objs(lib) end end
linker_flags()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 123 def linker_flags "-mmcu=#{board.mcu} -Wl,--gc-sections -Os" end
obj_to_src()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 101 def obj_to_src -> t do if lib = libs.find { |l| lib_objs(l).include? t } lib_srcs(lib).find do |e| e.pathmap("%{^#{lib_src_dir lib},#{BUILD_DIR}/#{lib}}X") == t.pathmap('%X') end else t.pathmap "%{^#{BUILD_DIR},#{src_dir}}X.cpp" end end end
objs()
click to toggle source
# File lib/embed_utils/rake_task.rb, line 97 def objs FileList["#{src_dir}/*.cpp"].pathmap "%{^#{src_dir},#{BUILD_DIR}}X.o" end