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