==============================================
Version: 0.1a
Created By: Michael D. Lowis
-Email: <mike@mdlowis.com>
+Email: mike@mdlowis.com
About This Project
----------------------------------------------
+++ /dev/null
-require 'pp'
-
-class Artifact
- def initialize(config)
- @settings = defaults()
- @settings.merge!(config)
-
- # Process Source paths
- @settings[:source_files] = make_file_list( @settings[:source_files] )
-
- # Process Include paths
- @settings[:include_dirs] = make_file_list( @settings[:include_dirs] )
- @settings[:include_dirs] = make_option_list( '-I', @settings[:include_dirs] )
-
- # Process compiler options
- @settings[:compiler_options] = make_option_list('',@settings[:compiler_options])
-
- # Process linker options
- @settings[:linker_options] = make_option_list('',@settings[:linker_options])
-
- # Process preprocessor defines
- @settings[:preprocessor_defines] = make_option_list('-D',@settings[:preprocessor_defines])
- end
-
- def defaults()
- return {
- :name => 'binary',
- :output_dir => 'build',
-
- :compiler_bin => 'c++',
- :compiler_options => ['-c'],
- :preprocessor_defines => [],
-
- :linker_bin => 'c++',
- :linker_options => [],
-
- :source_files => [ 'source/**/*.c*' ],
- :include_dirs => [ 'source/**/' ],
- :directories => []
- }
- end
-
- def to_s
- pp @settings
- end
-
- def get_bin_extension()
- if ENV['OS'] == 'Windows_NT' then
- return '.exe'
- else
- return ''
- end
- end
-
- def make_option_list(prefix,list)
- if list != nil then
- return list.collect{|opt| "#{prefix}#{opt} "}
- else
- return list
- end
- end
-
- def make_file_list(patt_list)
- file_list = []
- patt_list.each {|f|
- file_list.concat( FileList[f] )
- }
- return file_list
- end
-
- def register_directory(dir_name)
- @settings[:directories].push(dir_name)
- directory dir_name
- CLOBBER.include(dir_name)
- end
-
- def directories()
- return @settings[:directories]
- end
-
- def compile(input,output)
- config = @settings
- sh "#{config[:compiler_bin]} #{config[:preprocessor_defines]} #{config[:include_dirs]} #{config[:compiler_options]} #{output} #{input}"
- end
-
- def link(*args)
- config = @settings
- if args.size == 2 then
- file_list = args[0]
- output = args[1]
- sh "#{config[:linker_bin]} #{config[:linker_options]} #{output} #{file_list.collect{|x| x + ' '}}"
- else
- sh "#{config[:linker_bin]} #{config[:linker_options]} #{config[:name]} #{config[:object_files].collect{|x| x + ' '}}"
- end
- end
-end
+++ /dev/null
-require "#{File.expand_path(File.dirname(__FILE__))}/artifact"
-require 'rake'
-require 'rake/clean'
-
-class Binary < Artifact
- def initialize(config)
- super(config)
-
- # Register output directories
- register_directory("#{@settings[:output_dir]}/bin")
- register_directory("#{@settings[:output_dir]}/obj")
- register_directory("#{@settings[:output_dir]}/test")
-
- # set output name
- @settings[:name] = "#{@settings[:output_dir]}/bin/#{@settings[:name]}#{get_bin_extension()}"
- CLEAN.include(@settings[:bin_name])
-
- # Create object file list
- @settings[:object_source_lookup] = {}
- @settings[:object_files] = []
- @settings[:source_files].each{ |f|
- obj_file = @settings[:output_dir] + '/obj/' + File.basename(f).ext('o')
- CLEAN.include(obj_file)
- @settings[:object_files].push( obj_file )
- @settings[:object_source_lookup][obj_file] = f
- }
- end
-
- def name()
- return @settings[:name]
- end
-
- def objects()
- return @settings[:object_files]
- end
-
- def source_from_obj(obj)
- return @settings[:object_source_lookup][obj]
- end
-
- def obj_src_lookup()
- return lambda{|obj| @settings[:object_source_lookup][obj]}
- end
-end
+++ /dev/null
-require "#{File.expand_path(File.dirname(__FILE__))}/artifact"
-require 'rake'
-require 'rake/clean'
-
-class Library < Artifact
- def initialize(config)
- super(config)
-
- # Register output directories
- register_directory("#{@settings[:output_dir]}/bin")
- register_directory("#{@settings[:output_dir]}/obj")
-
- # set output name
- @settings[:name] = "#{@settings[:output_dir]}/bin/#{@settings[:name]}"
- CLEAN.include(@settings[:name])
-
- # Create object file list
- @settings[:object_source_lookup] = {}
- @settings[:object_files] = []
- @settings[:source_files].each{ |f|
- obj_file = @settings[:output_dir] + '/obj/' + File.basename(f).ext('o')
- CLEAN.include(obj_file)
- @settings[:object_files].push( obj_file )
- @settings[:object_source_lookup][obj_file] = f
- }
- end
-
- def defaults()
- return {
- :name => 'binary',
- :output_dir => 'build',
-
- :compiler_bin => 'c++',
- :compiler_options => ['-c'],
- :preprocessor_defines => [],
-
- :linker_bin => 'ar',
- :linker_options => ['rcs'],
-
- :source_files => [ 'source/**/*.c*' ],
- :include_dirs => [ 'source/**/' ],
- :directories => []
- }
- end
-
- def name()
- return @settings[:name]
- end
-
- def objects()
- return @settings[:object_files]
- end
-
- def source_from_obj(obj)
- return @settings[:object_source_lookup][obj]
- end
-
- def obj_src_lookup()
- return lambda{|obj| @settings[:object_source_lookup][obj]}
- end
-
- def setup_default_rake_tasks()
- task name() => directories() + objects() do
- link()
- end
-
- rule(/obj\/.+.o$/ => obj_src_lookup()) do |t|
- compile(t.source,t.name)
- end
- end
-end
+++ /dev/null
-require "#{File.expand_path(File.dirname(__FILE__))}/artifact.rb"
-require 'rake'
-require 'rake/clean'
-
-class Tests < Artifact
- def initialize(config)
- super(config)
-
- # Register test output directory
- register_directory("#{@settings[:output_dir]}/test")
-
- # Process test paths
- @settings[:test_files] = make_file_list( @settings[:test_files] )
-
- # Create source to runner lookup table
- @settings[:src_test_lookup] = {}
- @settings[:test_files].each{ |test|
- out_dir = "#{@settings[:output_dir]}/test"
- runner = "#{out_dir}/#{File.basename(test).ext('')}_runner.cpp"
- @settings[:src_test_lookup][runner] = test
- @settings[:runners].push( runner.ext(get_bin_extension()) )
- }
- end
-
- def defaults()
- defs = super()
- defs.merge!({
- :test_gen_bin => 'python tools/cxxtest/bin/cxxtestgen',
- :test_gen_options => ['--error-printer'],
- :output_dir => 'build',
- :test_files => ['tests/source/**.h'],
- :include_dirs => [ '.','tests/**/', 'source/**/', 'tools/cxxtest' ],
- :runners => []
- })
- return defs
- end
-
- def directories()
- dir_list = [ "#{@settings[:output_dir]}/test" ]
- directory dir_list[0]
- CLOBBER.include(dir_list[0])
- return dir_list
- end
-
- def runners()
- return @settings[:runners]
- end
-
- def bin_obj_lookup()
- return lambda{|bin| bin.ext('.o')}
- end
-
- def obj_src_lookup()
- return lambda{|obj| obj.ext('.cpp')}
- end
-
- def src_test_lookup()
- return lambda{|src| @settings[:src_test_lookup][src] }
- end
-
- def generate_test_runner(input,output)
- sh "#{@settings[:test_gen_bin]} #{@settings[:test_gen_options]} -o #{output} #{input}"
- end
-
- def run_all_test_runners()
- succeeded = true
- puts ''
- puts '------------------'
- puts ' Unit Tests'
- puts '------------------'
- puts ''
- @settings[:runners].each{|runner|
- status = system(runner)
- succeeded = (succeeded and status)
- puts ''
- }
- if not succeeded then
- abort('Error: There are unit test failures')
- end
- end
-
- def setup_default_rake_tasks()
- desc 'Execute all unit tests'
- task :test => directories() + runners() do
- run_all_test_runners();
- end
-
- rule '_runner.exe' => bin_obj_lookup() do |t|
- link([t.source],t.name)
- end
-
- rule( /test\/.+_runner.o$/ => obj_src_lookup() ) do |t|
- compile(t.source,t.name)
- end
-
- rule '_runner.cpp' => src_test_lookup() do |t|
- generate_test_runner(t.source,t.name)
- end
- end
-end
-