A metronome using the FRDM K64F board

Committer:
ram54288
Date:
Sun May 14 18:40:18 2017 +0000
Revision:
0:a7a43371b306
Initial commit

Who changed what in which revision?

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