FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:37:05 2017 +0000
Revision:
0:dbad57390bd1
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:dbad57390bd1 1 # ==========================================
ram54288 0:dbad57390bd1 2 # Unity Project - A Test Framework for C
ram54288 0:dbad57390bd1 3 # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
ram54288 0:dbad57390bd1 4 # [Released under MIT License. Please refer to license.txt for details]
ram54288 0:dbad57390bd1 5 # ==========================================
ram54288 0:dbad57390bd1 6
ram54288 0:dbad57390bd1 7 require 'yaml'
ram54288 0:dbad57390bd1 8 require 'fileutils'
ram54288 0:dbad57390bd1 9 require UNITY_ROOT + '../auto/unity_test_summary'
ram54288 0:dbad57390bd1 10 require UNITY_ROOT + '../auto/generate_test_runner'
ram54288 0:dbad57390bd1 11 require UNITY_ROOT + '../auto/colour_reporter'
ram54288 0:dbad57390bd1 12
ram54288 0:dbad57390bd1 13 module RakefileHelpers
ram54288 0:dbad57390bd1 14
ram54288 0:dbad57390bd1 15 C_EXTENSION = '.c'
ram54288 0:dbad57390bd1 16
ram54288 0:dbad57390bd1 17 def load_configuration(config_file)
ram54288 0:dbad57390bd1 18 unless ($configured)
ram54288 0:dbad57390bd1 19 $cfg_file = "targets/#{config_file}" unless (config_file =~ /[\\|\/]/)
ram54288 0:dbad57390bd1 20 $cfg = YAML.load(File.read($cfg_file))
ram54288 0:dbad57390bd1 21 $colour_output = false unless $cfg['colour']
ram54288 0:dbad57390bd1 22 $configured = true if (config_file != DEFAULT_CONFIG_FILE)
ram54288 0:dbad57390bd1 23 end
ram54288 0:dbad57390bd1 24 end
ram54288 0:dbad57390bd1 25
ram54288 0:dbad57390bd1 26 def configure_clean
ram54288 0:dbad57390bd1 27 CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil?
ram54288 0:dbad57390bd1 28 end
ram54288 0:dbad57390bd1 29
ram54288 0:dbad57390bd1 30 def configure_toolchain(config_file=DEFAULT_CONFIG_FILE)
ram54288 0:dbad57390bd1 31 config_file += '.yml' unless config_file =~ /\.yml$/
ram54288 0:dbad57390bd1 32 config_file = config_file unless config_file =~ /[\\|\/]/
ram54288 0:dbad57390bd1 33 load_configuration(config_file)
ram54288 0:dbad57390bd1 34 configure_clean
ram54288 0:dbad57390bd1 35 end
ram54288 0:dbad57390bd1 36
ram54288 0:dbad57390bd1 37 def get_unit_test_files
ram54288 0:dbad57390bd1 38 path = $cfg['compiler']['unit_tests_path'] + 'test*' + C_EXTENSION
ram54288 0:dbad57390bd1 39 path.gsub!(/\\/, '/')
ram54288 0:dbad57390bd1 40 FileList.new(path)
ram54288 0:dbad57390bd1 41 end
ram54288 0:dbad57390bd1 42
ram54288 0:dbad57390bd1 43 def get_local_include_dirs
ram54288 0:dbad57390bd1 44 include_dirs = $cfg['compiler']['includes']['items'].dup
ram54288 0:dbad57390bd1 45 include_dirs.delete_if {|dir| dir.is_a?(Array)}
ram54288 0:dbad57390bd1 46 return include_dirs
ram54288 0:dbad57390bd1 47 end
ram54288 0:dbad57390bd1 48
ram54288 0:dbad57390bd1 49 def extract_headers(filename)
ram54288 0:dbad57390bd1 50 includes = []
ram54288 0:dbad57390bd1 51 lines = File.readlines(filename)
ram54288 0:dbad57390bd1 52 lines.each do |line|
ram54288 0:dbad57390bd1 53 m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/)
ram54288 0:dbad57390bd1 54 if not m.nil?
ram54288 0:dbad57390bd1 55 includes << m[1]
ram54288 0:dbad57390bd1 56 end
ram54288 0:dbad57390bd1 57 end
ram54288 0:dbad57390bd1 58 return includes
ram54288 0:dbad57390bd1 59 end
ram54288 0:dbad57390bd1 60
ram54288 0:dbad57390bd1 61 def find_source_file(header, paths)
ram54288 0:dbad57390bd1 62 paths.each do |dir|
ram54288 0:dbad57390bd1 63 src_file = dir + header.ext(C_EXTENSION)
ram54288 0:dbad57390bd1 64 if (File.exists?(src_file))
ram54288 0:dbad57390bd1 65 return src_file
ram54288 0:dbad57390bd1 66 end
ram54288 0:dbad57390bd1 67 end
ram54288 0:dbad57390bd1 68 return nil
ram54288 0:dbad57390bd1 69 end
ram54288 0:dbad57390bd1 70
ram54288 0:dbad57390bd1 71 def tackit(strings)
ram54288 0:dbad57390bd1 72 if strings.is_a?(Array)
ram54288 0:dbad57390bd1 73 result = "\"#{strings.join}\""
ram54288 0:dbad57390bd1 74 else
ram54288 0:dbad57390bd1 75 result = strings
ram54288 0:dbad57390bd1 76 end
ram54288 0:dbad57390bd1 77 return result
ram54288 0:dbad57390bd1 78 end
ram54288 0:dbad57390bd1 79
ram54288 0:dbad57390bd1 80 def squash(prefix, items)
ram54288 0:dbad57390bd1 81 result = ''
ram54288 0:dbad57390bd1 82 items.each { |item| result += " #{prefix}#{tackit(item)}" }
ram54288 0:dbad57390bd1 83 return result
ram54288 0:dbad57390bd1 84 end
ram54288 0:dbad57390bd1 85
ram54288 0:dbad57390bd1 86 def should(behave, &block)
ram54288 0:dbad57390bd1 87 if block
ram54288 0:dbad57390bd1 88 puts "Should " + behave
ram54288 0:dbad57390bd1 89 yield block
ram54288 0:dbad57390bd1 90 else
ram54288 0:dbad57390bd1 91 puts "UNIMPLEMENTED CASE: Should #{behave}"
ram54288 0:dbad57390bd1 92 end
ram54288 0:dbad57390bd1 93 end
ram54288 0:dbad57390bd1 94
ram54288 0:dbad57390bd1 95 def build_compiler_fields
ram54288 0:dbad57390bd1 96 command = tackit($cfg['compiler']['path'])
ram54288 0:dbad57390bd1 97 if $cfg['compiler']['defines']['items'].nil?
ram54288 0:dbad57390bd1 98 defines = ''
ram54288 0:dbad57390bd1 99 else
ram54288 0:dbad57390bd1 100 defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'])
ram54288 0:dbad57390bd1 101 end
ram54288 0:dbad57390bd1 102 options = squash('', $cfg['compiler']['options'])
ram54288 0:dbad57390bd1 103 includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items'])
ram54288 0:dbad57390bd1 104 includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR)
ram54288 0:dbad57390bd1 105 return {:command => command, :defines => defines, :options => options, :includes => includes}
ram54288 0:dbad57390bd1 106 end
ram54288 0:dbad57390bd1 107
ram54288 0:dbad57390bd1 108 def compile(file, defines=[])
ram54288 0:dbad57390bd1 109 compiler = build_compiler_fields
ram54288 0:dbad57390bd1 110 cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " +
ram54288 0:dbad57390bd1 111 "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}"
ram54288 0:dbad57390bd1 112 obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}"
ram54288 0:dbad57390bd1 113 execute(cmd_str + obj_file)
ram54288 0:dbad57390bd1 114 return obj_file
ram54288 0:dbad57390bd1 115 end
ram54288 0:dbad57390bd1 116
ram54288 0:dbad57390bd1 117 def build_linker_fields
ram54288 0:dbad57390bd1 118 command = tackit($cfg['linker']['path'])
ram54288 0:dbad57390bd1 119 if $cfg['linker']['options'].nil?
ram54288 0:dbad57390bd1 120 options = ''
ram54288 0:dbad57390bd1 121 else
ram54288 0:dbad57390bd1 122 options = squash('', $cfg['linker']['options'])
ram54288 0:dbad57390bd1 123 end
ram54288 0:dbad57390bd1 124 if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?)
ram54288 0:dbad57390bd1 125 includes = ''
ram54288 0:dbad57390bd1 126 else
ram54288 0:dbad57390bd1 127 includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items'])
ram54288 0:dbad57390bd1 128 end
ram54288 0:dbad57390bd1 129 includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR)
ram54288 0:dbad57390bd1 130 return {:command => command, :options => options, :includes => includes}
ram54288 0:dbad57390bd1 131 end
ram54288 0:dbad57390bd1 132
ram54288 0:dbad57390bd1 133 def link_it(exe_name, obj_list)
ram54288 0:dbad57390bd1 134 linker = build_linker_fields
ram54288 0:dbad57390bd1 135 cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " +
ram54288 0:dbad57390bd1 136 (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join +
ram54288 0:dbad57390bd1 137 $cfg['linker']['bin_files']['prefix'] + ' ' +
ram54288 0:dbad57390bd1 138 $cfg['linker']['bin_files']['destination'] +
ram54288 0:dbad57390bd1 139 exe_name + $cfg['linker']['bin_files']['extension']
ram54288 0:dbad57390bd1 140 execute(cmd_str)
ram54288 0:dbad57390bd1 141 end
ram54288 0:dbad57390bd1 142
ram54288 0:dbad57390bd1 143 def build_simulator_fields
ram54288 0:dbad57390bd1 144 return nil if $cfg['simulator'].nil?
ram54288 0:dbad57390bd1 145 if $cfg['simulator']['path'].nil?
ram54288 0:dbad57390bd1 146 command = ''
ram54288 0:dbad57390bd1 147 else
ram54288 0:dbad57390bd1 148 command = (tackit($cfg['simulator']['path']) + ' ')
ram54288 0:dbad57390bd1 149 end
ram54288 0:dbad57390bd1 150 if $cfg['simulator']['pre_support'].nil?
ram54288 0:dbad57390bd1 151 pre_support = ''
ram54288 0:dbad57390bd1 152 else
ram54288 0:dbad57390bd1 153 pre_support = squash('', $cfg['simulator']['pre_support'])
ram54288 0:dbad57390bd1 154 end
ram54288 0:dbad57390bd1 155 if $cfg['simulator']['post_support'].nil?
ram54288 0:dbad57390bd1 156 post_support = ''
ram54288 0:dbad57390bd1 157 else
ram54288 0:dbad57390bd1 158 post_support = squash('', $cfg['simulator']['post_support'])
ram54288 0:dbad57390bd1 159 end
ram54288 0:dbad57390bd1 160 return {:command => command, :pre_support => pre_support, :post_support => post_support}
ram54288 0:dbad57390bd1 161 end
ram54288 0:dbad57390bd1 162
ram54288 0:dbad57390bd1 163 def execute(command_string, verbose=true)
ram54288 0:dbad57390bd1 164 report command_string
ram54288 0:dbad57390bd1 165 output = `#{command_string}`.chomp
ram54288 0:dbad57390bd1 166 report(output) if (verbose && !output.nil? && (output.length > 0))
ram54288 0:dbad57390bd1 167 if $?.exitstatus != 0
ram54288 0:dbad57390bd1 168 raise "Command failed. (Returned #{$?.exitstatus})"
ram54288 0:dbad57390bd1 169 end
ram54288 0:dbad57390bd1 170 return output
ram54288 0:dbad57390bd1 171 end
ram54288 0:dbad57390bd1 172
ram54288 0:dbad57390bd1 173 def report_summary
ram54288 0:dbad57390bd1 174 summary = UnityTestSummary.new
ram54288 0:dbad57390bd1 175 summary.set_root_path(UNITY_ROOT)
ram54288 0:dbad57390bd1 176 results_glob = "#{$cfg['compiler']['build_path']}*.test*"
ram54288 0:dbad57390bd1 177 results_glob.gsub!(/\\/, '/')
ram54288 0:dbad57390bd1 178 results = Dir[results_glob]
ram54288 0:dbad57390bd1 179 summary.set_targets(results)
ram54288 0:dbad57390bd1 180 report summary.run
ram54288 0:dbad57390bd1 181 end
ram54288 0:dbad57390bd1 182
ram54288 0:dbad57390bd1 183 def run_tests(test_files)
ram54288 0:dbad57390bd1 184 report 'Running Unity system tests...'
ram54288 0:dbad57390bd1 185
ram54288 0:dbad57390bd1 186 # Tack on TEST define for compiling unit tests
ram54288 0:dbad57390bd1 187 load_configuration($cfg_file)
ram54288 0:dbad57390bd1 188 test_defines = ['TEST']
ram54288 0:dbad57390bd1 189 $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil?
ram54288 0:dbad57390bd1 190 $cfg['compiler']['defines']['items'] << 'TEST'
ram54288 0:dbad57390bd1 191
ram54288 0:dbad57390bd1 192 include_dirs = get_local_include_dirs
ram54288 0:dbad57390bd1 193
ram54288 0:dbad57390bd1 194 # Build and execute each unit test
ram54288 0:dbad57390bd1 195 test_files.each do |test|
ram54288 0:dbad57390bd1 196 obj_list = []
ram54288 0:dbad57390bd1 197
ram54288 0:dbad57390bd1 198 if !$cfg['compiler']['aux_sources'].nil?
ram54288 0:dbad57390bd1 199 $cfg['compiler']['aux_sources'].each do |aux|
ram54288 0:dbad57390bd1 200 obj_list << compile(aux, test_defines)
ram54288 0:dbad57390bd1 201 end
ram54288 0:dbad57390bd1 202 end
ram54288 0:dbad57390bd1 203
ram54288 0:dbad57390bd1 204 # Detect dependencies and build required modules
ram54288 0:dbad57390bd1 205 extract_headers(test).each do |header|
ram54288 0:dbad57390bd1 206 # Compile corresponding source file if it exists
ram54288 0:dbad57390bd1 207 src_file = find_source_file(header, include_dirs)
ram54288 0:dbad57390bd1 208 if !src_file.nil?
ram54288 0:dbad57390bd1 209 obj_list << compile(src_file, test_defines)
ram54288 0:dbad57390bd1 210 end
ram54288 0:dbad57390bd1 211 end
ram54288 0:dbad57390bd1 212
ram54288 0:dbad57390bd1 213 # Build the test runner (generate if configured to do so)
ram54288 0:dbad57390bd1 214 test_base = File.basename(test, C_EXTENSION)
ram54288 0:dbad57390bd1 215
ram54288 0:dbad57390bd1 216 runner_name = test_base + '_Runner.c'
ram54288 0:dbad57390bd1 217 runner_path = ''
ram54288 0:dbad57390bd1 218
ram54288 0:dbad57390bd1 219 if $cfg['compiler']['runner_path'].nil?
ram54288 0:dbad57390bd1 220 runner_path = $cfg['compiler']['build_path'] + runner_name
ram54288 0:dbad57390bd1 221 else
ram54288 0:dbad57390bd1 222 runner_path = $cfg['compiler']['runner_path'] + runner_name
ram54288 0:dbad57390bd1 223 end
ram54288 0:dbad57390bd1 224
ram54288 0:dbad57390bd1 225 options = $cfg[:unity]
ram54288 0:dbad57390bd1 226 options[:use_param_tests] = (test =~ /parameterized/) ? true : false
ram54288 0:dbad57390bd1 227 UnityTestRunnerGenerator.new(options).run(test, runner_path)
ram54288 0:dbad57390bd1 228 obj_list << compile(runner_path, test_defines)
ram54288 0:dbad57390bd1 229
ram54288 0:dbad57390bd1 230 # Build the test module
ram54288 0:dbad57390bd1 231 obj_list << compile(test, test_defines)
ram54288 0:dbad57390bd1 232
ram54288 0:dbad57390bd1 233 # Link the test executable
ram54288 0:dbad57390bd1 234 link_it(test_base, obj_list)
ram54288 0:dbad57390bd1 235
ram54288 0:dbad57390bd1 236 # Execute unit test and generate results file
ram54288 0:dbad57390bd1 237 simulator = build_simulator_fields
ram54288 0:dbad57390bd1 238 executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension']
ram54288 0:dbad57390bd1 239 if simulator.nil?
ram54288 0:dbad57390bd1 240 cmd_str = executable
ram54288 0:dbad57390bd1 241 else
ram54288 0:dbad57390bd1 242 cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}"
ram54288 0:dbad57390bd1 243 end
ram54288 0:dbad57390bd1 244 output = execute(cmd_str)
ram54288 0:dbad57390bd1 245 test_results = $cfg['compiler']['build_path'] + test_base
ram54288 0:dbad57390bd1 246 if output.match(/OK$/m).nil?
ram54288 0:dbad57390bd1 247 test_results += '.testfail'
ram54288 0:dbad57390bd1 248 else
ram54288 0:dbad57390bd1 249 test_results += '.testpass'
ram54288 0:dbad57390bd1 250 end
ram54288 0:dbad57390bd1 251 File.open(test_results, 'w') { |f| f.print output }
ram54288 0:dbad57390bd1 252
ram54288 0:dbad57390bd1 253 end
ram54288 0:dbad57390bd1 254 end
ram54288 0:dbad57390bd1 255 end