require 'yasm/yasm'
require 'rprogram/task'
module YASM
#
# == YASM options:
#
# --version:: yasm.version
# --license:: yasm.license
# --help:: yasm.help
#
# --arch:: yasm.arch
# --parser:: yasm.parser
# --preproc:: yasm.preprocessor
# --oformat:: yasm.output_format
# --dformat:: yasm.debug_format
# --lformat:: yasm.list_format
#
# --list:: yasm.list_file
# --objfile:: yasm.output
# --mapfile:: yasm.map_file
#
# --machine:: yasm.machine
# --force-strict:: yasm.force_strict
# -w:: yasm.inhibit_warnings
# -W:: yasm.toggle_warnings
# -M:: yasm.gen_makefile_deps
# -E:: yasm.redirect_errors_to
# -e:: yasm.redirect_errors
# --preproc-only:: yasm.preprocessor_only
# -I:: yasm.include
# -P:: yasm.pre_include
# -D:: yasm.define
# -U:: yasm.undefine
# -X:: yasm.message_style
# --prefix:: yasm.prefix
# --suffix:: yasm.suffix
#
# file:: yasm.file
#
class Task < RProgram::Task
# The known YASM targets
TARGETS = {
:x86 => {:arch => :x86, :machine => :x86},
:amd64 => {:arch => :x86, :machine => :amd64},
:lc3b => {:arch => :lc3b, :machine => :lc3b}
}
long_option :flag => '--version'
long_option :flag => '--license'
long_option :flag => '--help'
long_option :flag => '--arch', :equals => true
long_option :flag => '--parser', :equals => true
long_option :flag => '--preproc',
:equals => true,
:name => :preprocessor
long_option :flag => '--oformat',
:equals => true,
:name => :output_format
long_option :flag => '--dformat',
:equals => true,
:name => :debug_format
long_option :flag => '--lformat',
:equals => true,
:name => :list_format
long_option :flag => '--list',
:equals => true,
:name => :list_file
long_option :flag => '--objfile',
:equals => true,
:name => :output
long_option :flag => '--mapfile',
:equals => true,
:name => :map_file
long_option :flag => '--machine', :equals => true
long_option :flag => '--force-strict'
short_option :flag => '-w', :name => :inhibit_warnings
short_option :flag => '-W', :name => :toggle_warnings
short_option :flag => '-M', :name => :gen_makefile_deps
short_option :flag => '-E', :name => :redirect_errors_to
short_option :flag => '-s', :name => :redirect_errors
long_option :flag => '--preproc-only', :name => :preprocessor_only
short_option :flag => '-I', :name => :include, :multiple => true
short_option :flag => '-P', :name => :pre_include, :multiple => true
short_option :flag => '-D', :name => :define, :multiple => true
short_option :flag => '-U', :name => :undefine, :multiple => true
short_option :flag => '-X', :name => :message_style
long_option :flag => '--prefix'
long_option :flag => '--suffix'
non_option :tailing => true, :name => :file
#
# Creates a new Task object.
#
# @param [Hash{Symbol => Object}] options
# Additional options for the task.
#
# @option options [String, Symbol] :target
# The arch/machine to target.
#
# @yield [task]
# If a block is given, it will be passed the newly created task
# object.
#
# @yieldparam [Task] task
# The new task object.
#
# @see Task#target!
#
def initialize(options={},&block)
target = options.delete(:target)
super(options,&block)
self.target!(target) if target
self.parser ||= YASM.parser
self.arch ||= YASM.arch
self.machine ||= YASM.machine
self.debug_format ||= YASM.debug_format
self.output_format ||= YASM.output_format
end
#
# Sets the YASM +arch+ and +machine+.
#
# @param [String, Symbol] name
# The target name.
#
# @raise [RuntimeError]
# The specified target is unknown.
#
# @return [true]
# The YASM +arch+ and +machine+ options were set successfully.
#
# @example
# yasm.target! :amd64
#
def target!(name)
target = TARGETS[name.to_sym]
unless target
raise(RuntimeError,"unknown YASM target #{name.inspect}",caller)
end
self.arch = target[:arch]
self.machine = target[:machine]
return true
end
alias syntax parser
alias syntax= parser=
end
end