class PaperHouse::BuildTask

Common base class for *.c compilation tasks.

Attributes

cc[W]

@!attribute cc

C compiler name or path.
name[RW]

Name of task.

target_directory[W]

@!attribute target_directory

Directory where *.o files are created.

Public Class Methods

new(name, &block) click to toggle source

@private

# File lib/paper_house/build_task.rb, line 56
def initialize(name, &block)
  @name = name.to_s
  block.call self if block
  define
end

Public Instance Methods

cc() click to toggle source
# File lib/paper_house/build_task.rb, line 51
def cc
  ENV['CC'] || @cc || 'gcc'
end
target_directory() click to toggle source
# File lib/paper_house/build_task.rb, line 43
def target_directory
  @target_directory ||= '.'
end
target_path() click to toggle source

Relative path to target file.

# File lib/paper_house/build_task.rb, line 63
def target_path
  File.join target_directory, target_file_name.to_s
end

Private Instance Methods

ad_cc_options() click to toggle source
build() click to toggle source
# File lib/paper_house/build_task.rb, line 105
def build
  check_sources_list
  generate_target
end
check_sources_list() click to toggle source
# File lib/paper_house/build_task.rb, line 110
def check_sources_list
  fail "Cannot find sources (#{@sources})." if sources_list.empty?
end
clobber_targets() click to toggle source
# File lib/paper_house/build_task.rb, line 119
def clobber_targets
  [target_path, dependency.path]
end
compile(o_file, c_file) click to toggle source
# File lib/paper_house/build_task.rb, line 127
def compile(o_file, c_file)
  return if no_need_to_compile?(o_file, c_file)
  auto_depends = AutoDepends.new(c_file, o_file, cc, ad_cc_options)
  auto_depends.run
  dependency.write o_file, auto_depends.data
end
define() click to toggle source
# File lib/paper_house/build_task.rb, line 69
def define
  define_main_task
  define_directory_task
  define_all_c_compile_tasks
  define_maybe_generate_target_task
  define_clean_tasks
end
define_all_c_compile_tasks() click to toggle source
# File lib/paper_house/build_task.rb, line 86
def define_all_c_compile_tasks
  sources_list.zip(objects) do |source, object|
    define_c_compile_task source, object
  end
end
define_c_compile_task(source, object) click to toggle source
# File lib/paper_house/build_task.rb, line 92
def define_c_compile_task(source, object)
  task object => source do |task|
    compile task.name, task.prerequisites[0]
  end
end
define_clean_tasks() click to toggle source
# File lib/paper_house/build_task.rb, line 114
def define_clean_tasks
  CleanTask.new objects, :CLEAN
  CleanTask.new clobber_targets, :CLOBBER
end
define_directory_task() click to toggle source
# File lib/paper_house/build_task.rb, line 82
def define_directory_task
  directory target_directory
end
define_main_task() click to toggle source
# File lib/paper_house/build_task.rb, line 77
def define_main_task
  path = target_path
  task name => [target_directory, path]
end
define_maybe_generate_target_task() click to toggle source
# File lib/paper_house/build_task.rb, line 98
def define_maybe_generate_target_task
  file target_path => objects do |task|
    next if uptodate?(task.name, task.prerequisites)
    build
  end
end
dependency() click to toggle source
# File lib/paper_house/build_task.rb, line 142
def dependency
  @dependency ||= Dependency.new(@name)
end
generate_target() click to toggle source
# File lib/paper_house/build_task.rb, line 146
def generate_target
  command = ([cc] + cc_options).join(' ')
  sh(command) do |ok, status|
    ok || fail(BuildFailed.new(command, status))
  end
end
no_need_to_compile?(o_file, c_file) click to toggle source
# File lib/paper_house/build_task.rb, line 134
def no_need_to_compile?(o_file, c_file)
  uptodate?(o_file, dependency.read(o_file) << c_file)
end
objects() click to toggle source
# File lib/paper_house/build_task.rb, line 123
def objects
  sources_list.pathmap File.join(target_directory, '%n.o')
end