update ceedling to 0.29.0

This commit is contained in:
hathach
2019-11-01 17:48:59 +07:00
parent 774a9f63ab
commit b25faa97c2
59 changed files with 1962 additions and 736 deletions

View File

@@ -26,16 +26,21 @@ class Cacheinator
return cached_filepath
end
def diff_cached_test_config?(hash)
cached_filepath = @file_path_utils.form_test_build_cache_path(INPUT_CONFIGURATION_CACHE_FILE)
return @cacheinator_helper.diff_cached_config?( cached_filepath, hash )
end
def diff_cached_test_defines?(files)
cached_filepath = @file_path_utils.form_test_build_cache_path(DEFINES_DEPENDENCY_CACHE_FILE)
return @cacheinator_helper.diff_cached_defines?( cached_filepath, files )
end
def diff_cached_release_config?(hash)
cached_filepath = @file_path_utils.form_release_build_cache_path(INPUT_CONFIGURATION_CACHE_FILE)
return @cacheinator_helper.diff_cached_config?( cached_filepath, hash )
end

View File

@@ -8,5 +8,24 @@ class CacheinatorHelper
return true if ( (@file_wrapper.exist?(cached_filepath)) and (!(@yaml_wrapper.load(cached_filepath) == hash)) )
return false
end
def diff_cached_defines?(cached_filepath, files)
current_defines = COLLECTION_DEFINES_TEST_AND_VENDOR.reject(&:empty?)
current_dependency = Hash[files.collect { |source| [source, current_defines.dup] }]
if not @file_wrapper.exist?(cached_filepath)
@yaml_wrapper.dump(cached_filepath, current_dependency)
return false
end
dependencies = @yaml_wrapper.load(cached_filepath)
if dependencies.values_at(*current_dependency.keys) != current_dependency.values
dependencies.merge!(current_dependency)
@yaml_wrapper.dump(cached_filepath, dependencies)
return true
end
return false
end
end

View File

@@ -64,6 +64,8 @@ class Configurator
end
# The default values defined in defaults.rb (eg. DEFAULT_TOOLS_TEST) are populated
# into @param config
def populate_defaults(config)
new_config = DEFAULT_CEEDLING_CONFIG.deep_clone
new_config.deep_merge!(config)
@@ -184,7 +186,8 @@ class Configurator
plugin_defaults = @configurator_plugins.find_plugin_defaults(config, paths_hash)
config_plugins.each do |plugin|
config.deep_merge!( @yaml_wrapper.load(plugin) )
plugin_config = @yaml_wrapper.load(plugin)
config.deep_merge(plugin_config)
end
plugin_defaults.each do |defaults|
@@ -346,6 +349,10 @@ class Configurator
end
def eval_path_list( paths )
if paths.kind_of?(Array)
paths = Array.new(paths)
end
paths.flatten.each do |path|
path.replace( @system_wrapper.module_eval( path ) ) if (path =~ RUBY_STRING_REPLACEMENT_PATTERN)
end

View File

@@ -274,10 +274,17 @@ class ConfiguratorBuilder
return {:collection_all_assembly => all_assembly} if ((not in_hash[:release_build_use_assembly]) && (not in_hash[:test_build_use_assembly]))
# Sprinkle in all assembly files we can find in the source folders
in_hash[:collection_paths_source].each do |path|
all_assembly.include( File.join(path, "*#{in_hash[:extension_assembly]}") )
end
# Also add all assembly files we can find in the support folders
in_hash[:collection_paths_support].each do |path|
all_assembly.include( File.join(path, "*#{in_hash[:extension_assembly]}") )
end
# Also add files that we are explicitly adding via :files:assembly: section
@file_system_utils.revise_file_list( all_assembly, in_hash[:files_assembly] )
return {:collection_all_assembly => all_assembly}

View File

@@ -63,7 +63,7 @@ DEFAULT_CEEDLING_MAIN_PROJECT_FILE = 'project.yml' unless defined?(DEFAULT_CEEDL
DEFAULT_CEEDLING_USER_PROJECT_FILE = 'user.yml' unless defined?(DEFAULT_CEEDLING_USER_PROJECT_FILE) # supplemental user config file
INPUT_CONFIGURATION_CACHE_FILE = 'input.yml' unless defined?(INPUT_CONFIGURATION_CACHE_FILE) # input configuration file dump
DEFINES_DEPENDENCY_CACHE_FILE = 'defines_dependency.yml' unless defined?(DEFINES_DEPENDENCY_CACHE_FILE) # preprocessor definitions for files
TEST_ROOT_NAME = 'test' unless defined?(TEST_ROOT_NAME)
TEST_TASK_ROOT = TEST_ROOT_NAME + ':' unless defined?(TEST_TASK_ROOT)

View File

@@ -38,20 +38,23 @@ class Dependinator
def enhance_runner_dependencies(runner_filepath)
@rake_wrapper[runner_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed)
@rake_wrapper[runner_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
@project_config_manager.test_defines_changed)
end
def enhance_shallow_include_lists_dependencies(include_lists)
include_lists.each do |include_list_filepath|
@rake_wrapper[include_list_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed)
@rake_wrapper[include_list_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
@project_config_manager.test_defines_changed)
end
end
def enhance_preprocesed_file_dependencies(files)
files.each do |filepath|
@rake_wrapper[filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed)
@rake_wrapper[filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
@project_config_manager.test_defines_changed)
end
end
@@ -59,7 +62,8 @@ class Dependinator
def enhance_mock_dependencies(mocks_list)
# if input configuration or ceedling changes, make sure these guys get rebuilt
mocks_list.each do |mock_filepath|
@rake_wrapper[mock_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed)
@rake_wrapper[mock_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
@project_config_manager.test_defines_changed)
@rake_wrapper[mock_filepath].enhance( @configurator.cmock_unity_helper ) if (@configurator.cmock_unity_helper)
end
end
@@ -67,25 +71,28 @@ class Dependinator
def enhance_dependencies_dependencies(dependencies)
dependencies.each do |dependencies_filepath|
@rake_wrapper[dependencies_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed)
@rake_wrapper[dependencies_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
@project_config_manager.test_defines_changed)
end
end
def enhance_test_build_object_dependencies(objects)
objects.each do |object_filepath|
@rake_wrapper[object_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed)
@rake_wrapper[object_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
@project_config_manager.test_defines_changed)
end
end
def enhance_results_dependencies(result_filepath)
@rake_wrapper[result_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed)
@rake_wrapper[result_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
@project_config_manager.test_defines_changed)
end
def setup_test_executable_dependencies(test, objects)
@rake_wrapper.create_file_task( @file_path_utils.form_test_executable_filepath(test), objects)
@rake_wrapper.create_file_task( @file_path_utils.form_test_executable_filepath(test), objects )
end
end

View File

@@ -19,6 +19,7 @@ class Generator
def generate_shallow_includes_list(context, file)
@streaminator.stdout_puts("Generating include list for #{File.basename(file)}...", Verbosity::NORMAL)
@preprocessinator.preprocess_shallow_includes(file)
end
@@ -92,6 +93,8 @@ class Generator
arg_hash[:list],
arg_hash[:dependencies])
@streaminator.stdout_puts("Command: #{command}", Verbosity::DEBUG)
begin
shell_result = @tool_executor.exec( command[:line], command[:options] )
rescue ShellExecutionException => ex
@@ -124,6 +127,7 @@ class Generator
arg_hash[:map],
arg_hash[:libraries]
)
@streaminator.stdout_puts("Command: #{command}", Verbosity::DEBUG)
begin
shell_result = @tool_executor.exec( command[:line], command[:options] )
@@ -157,9 +161,12 @@ class Generator
# Unity's exit code is equivalent to the number of failed tests, so we tell @tool_executor not to fail out if there are failures
# so that we can run all tests and collect all results
command = @tool_executor.build_command_line(arg_hash[:tool], [], arg_hash[:executable])
@streaminator.stdout_puts("Command: #{command}", Verbosity::DEBUG)
command[:options][:boom] = false
shell_result = @tool_executor.exec( command[:line], command[:options] )
shell_result[:exit_code] = 0 #Don't Let The Failure Count Make Us Believe Things Aren't Working
#Don't Let The Failure Count Make Us Believe Things Aren't Working
shell_result[:exit_code] = 0
@generator_helper.test_results_error_handler(executable, shell_result)
processed = @generator_test_results.process_and_write_results( shell_result,

View File

@@ -7,7 +7,7 @@ class GeneratorTestResults
constructor :configurator, :generator_test_results_sanity_checker, :yaml_wrapper
def process_and_write_results(unity_shell_result, results_file, test_file)
output_file = results_file
output_file = results_file
results = get_results_structure
@@ -17,10 +17,10 @@ class GeneratorTestResults
# process test statistics
if (unity_shell_result[:output] =~ TEST_STDOUT_STATISTICS_PATTERN)
results[:counts][:total] = $1.to_i
results[:counts][:failed] = $2.to_i
results[:counts][:total] = $1.to_i
results[:counts][:failed] = $2.to_i
results[:counts][:ignored] = $3.to_i
results[:counts][:passed] = (results[:counts][:total] - results[:counts][:failed] - results[:counts][:ignored])
results[:counts][:passed] = (results[:counts][:total] - results[:counts][:failed] - results[:counts][:ignored])
end
# remove test statistics lines
@@ -31,16 +31,16 @@ class GeneratorTestResults
case line
when /(:IGNORE)/
elements = extract_line_elements(line, results[:source][:file])
results[:ignores] << elements[0]
results[:stdout] << elements[1] if (!elements[1].nil?)
results[:ignores] << elements[0]
results[:stdout] << elements[1] if (!elements[1].nil?)
when /(:PASS$)/
elements = extract_line_elements(line, results[:source][:file])
results[:successes] << elements[0]
results[:stdout] << elements[1] if (!elements[1].nil?)
results[:stdout] << elements[1] if (!elements[1].nil?)
when /(:FAIL)/
elements = extract_line_elements(line, results[:source][:file])
results[:failures] << elements[0]
results[:stdout] << elements[1] if (!elements[1].nil?)
results[:failures] << elements[0]
results[:stdout] << elements[1] if (!elements[1].nil?)
else # collect up all other
results[:stdout] << line.chomp
end

View File

@@ -15,7 +15,9 @@ class GeneratorTestRunner
pre_test_file = @file_path_utils.form_preprocessed_file_filepath(test_file)
#actually look for the tests using Unity's test runner generator
tests_and_line_numbers = @test_runner_generator.find_tests(@file_wrapper.read(pre_test_file))
contents = @file_wrapper.read(pre_test_file)
tests_and_line_numbers = @test_runner_generator.find_tests(contents)
@test_runner_generator.find_setup_and_teardown(contents)
#look up the line numbers in the original file
source_lines = @file_wrapper.read(test_file).split("\n")
@@ -31,7 +33,9 @@ class GeneratorTestRunner
end
else
#Just look for the tests using Unity's test runner generator
tests_and_line_numbers = @test_runner_generator.find_tests(@file_wrapper.read(test_file))
contents = @file_wrapper.read(test_file)
tests_and_line_numbers = @test_runner_generator.find_tests(contents)
@test_runner_generator.find_setup_and_teardown(contents)
end
return tests_and_line_numbers

View File

@@ -41,7 +41,9 @@ project_file_loader:
project_config_manager:
compose:
- cacheinator
- configurator
- yaml_wrapper
- file_wrapper
cacheinator:
compose:
@@ -172,6 +174,7 @@ task_invoker:
- dependinator
- rake_utils
- rake_wrapper
- project_config_manager
flaginator:
compose:

View File

@@ -28,8 +28,7 @@ class Preprocessinator
end
def preprocess_shallow_includes(filepath)
dependencies_rule = @preprocessinator_includes_handler.form_shallow_dependencies_rule(filepath)
includes = @preprocessinator_includes_handler.extract_shallow_includes(dependencies_rule)
includes = @preprocessinator_includes_handler.extract_includes(filepath)
@preprocessinator_includes_handler.write_shallow_includes_list(
@file_path_utils.form_preprocessed_includes_list_filepath(filepath), includes)

View File

@@ -3,6 +3,7 @@
class PreprocessinatorIncludesHandler
constructor :configurator, :tool_executor, :task_invoker, :file_path_utils, :yaml_wrapper, :file_wrapper
@@makefile_cache = {}
# shallow includes: only those headers a source file explicitly includes
@@ -20,6 +21,9 @@ class PreprocessinatorIncludesHandler
# === Return
# _String_:: The text of the dependency rule generated by the preprocessor.
def form_shallow_dependencies_rule(filepath)
if @@makefile_cache.has_key?(filepath)
return @@makefile_cache[filepath]
end
# change filename (prefix of '_') to prevent preprocessor from finding
# include files in temp directory containing file it's scanning
temp_filepath = @file_path_utils.form_temp_path(filepath, '_')
@@ -44,6 +48,7 @@ class PreprocessinatorIncludesHandler
command = @tool_executor.build_command_line(@configurator.tools_test_includes_preprocessor, [], temp_filepath)
shell_result = @tool_executor.exec(command[:line], command[:options])
@@makefile_cache[filepath] = shell_result[:output]
return shell_result[:output]
end
@@ -52,19 +57,52 @@ class PreprocessinatorIncludesHandler
# provided, annotated Make dependency rule.
#
# === Arguments
# +make_rule+ _String_:: Annotated Make dependency rule.
# +filepath+ _String_:: C source or header file to extract includes for.
#
# === Return
# _Array_ of _String_:: Array of the direct dependencies for the source file.
def extract_shallow_includes(make_rule)
def extract_includes(filepath)
to_process = [filepath]
ignore_list = []
list = []
include_paths = @configurator.project_config_hash[:collection_paths_include]
include_paths = [] if include_paths.nil?
include_paths.map! {|path| File.expand_path(path)}
while to_process.length > 0
target = to_process.shift()
ignore_list << target
# puts "[HELL] Processing: \t\t#{target}"
new_deps, new_to_process = extract_includes_helper(target, include_paths, ignore_list)
list += new_deps
to_process += new_to_process
if (!@configurator.project_config_hash.has_key?(:project_auto_link_deep_dependencies) or
!@configurator.project_config_hash[:project_auto_link_deep_dependencies])
break
else
list = list.uniq()
to_process = to_process.uniq()
end
end
return list
end
def extract_includes_helper(filepath, include_paths, ignore_list)
# Extract the dependencies from the make rule
hdr_ext = @configurator.extension_header
make_rule = self.form_shallow_dependencies_rule(filepath)
dependencies = make_rule.split.find_all {|path| path.end_with?(hdr_ext) }.uniq
dependencies.map! {|hdr| hdr.gsub('\\','/') }
# Separate the real files form the annotated ones and remove the '@@@@'
annotated_headers, real_headers = dependencies.partition {|hdr| hdr =~ /^@@@@/ }
annotated_headers.map! {|hdr| hdr.gsub('@@@@','') }
# Matching annotated_headers values against real_headers to ensure that
# annotated_headers contain full path entries (as returned by make rule)
annotated_headers.map! {|hdr| real_headers.find {|real_hdr| !real_hdr.match(/(.*\/)?#{Regexp.escape(hdr)}/).nil? } }
annotated_headers = annotated_headers.compact
# Find which of our annotated headers are "real" dependencies. This is
# intended to weed out dependencies that have been removed due to build
@@ -87,7 +125,54 @@ class PreprocessinatorIncludesHandler
sdependencies.map! {|hdr| hdr.gsub('\\','/') }
list += sdependencies
list
to_process = []
if @configurator.project_config_hash.has_key?(:project_auto_link_deep_dependencies) && @configurator.project_config_hash[:project_auto_link_deep_dependencies]
# Creating list of mocks
mocks = annotated_headers.find_all do |annotated_header|
File.basename(annotated_header) =~ /^#{@configurator.project_config_hash[:cmock_mock_prefix]}.*$/
end.compact
# Creating list of headers that should be recursively pre-processed
# Skipping mocks and unity.h
headers_to_deep_link = annotated_headers.select do |annotated_header|
!(mocks.include? annotated_header) and (annotated_header.match(/^(.*\/)?unity\.h$/).nil?)
end
headers_to_deep_link.map! {|hdr| File.expand_path(hdr)}
mocks.each do |mock|
dirname = File.dirname(mock)
#basename = File.basename(mock).delete_prefix(@configurator.project_config_hash[:cmock_mock_prefix])
basename = File.basename(mock).sub(@configurator.project_config_hash[:cmock_mock_prefix], '')
if dirname != "."
ignore_list << File.join(dirname, basename)
else
ignore_list << basename
end
end.compact
# Filtering list of final includes to only include mocks and anything that is NOT in the ignore_list
list = list.select do |item|
mocks.include? item or !(ignore_list.any? { |ignore_item| !item.match(/^(.*\/)?#{Regexp.escape(ignore_item)}$/).nil? })
end
headers_to_deep_link.each do |hdr|
if (ignore_list.none? {|ignore_header| hdr.match(/^(.*\/)?#{Regexp.escape(ignore_header)}$/)} and
include_paths.none? {|include_path| hdr =~ /^#{include_path}\.*/})
if File.exist?(hdr)
to_process << hdr
#source_file = hdr.delete_suffix(hdr_ext) + src_ext
source_file = hdr.chomp(hdr_ext) + src_ext
if source_file != hdr and File.exist?(source_file)
to_process << source_file
end
end
end
end
end
return list, to_process
end
def write_shallow_includes_list(filepath, list)

View File

@@ -3,16 +3,17 @@ require 'ceedling/constants'
class ProjectConfigManager
attr_reader :options_files, :release_config_changed, :test_config_changed
attr_reader :options_files, :release_config_changed, :test_config_changed, :test_defines_changed
attr_accessor :config_hash
constructor :cacheinator, :yaml_wrapper
constructor :cacheinator, :configurator, :yaml_wrapper, :file_wrapper
def setup
@options_files = []
@release_config_changed = false
@test_config_changed = false
@test_defines_changed = false
end
@@ -34,4 +35,12 @@ class ProjectConfigManager
@test_config_changed = @cacheinator.diff_cached_test_config?( @config_hash )
end
def process_test_defines_change(files)
# has definitions changed since last test build
@test_defines_changed = @cacheinator.diff_cached_test_defines?( files )
if @test_defines_changed
# update timestamp for rake task prerequisites
@file_wrapper.touch( @configurator.project_test_force_rebuild_filepath )
end
end
end

View File

@@ -35,8 +35,7 @@ end
rule(/#{PROJECT_TEST_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_EXECUTABLE}$/) do |bin_file|
lib_args = ((defined? LIBRARIES_SYSTEM) ? LIBRARIES_SYSTEM : [])
lib_args.map! {|v| LIBRARIES_FLAG.gsub(/\$\{1\}/, v) } if (defined? LIBRARIES_FLAG)
lib_args = @ceedling[:test_invoker].convert_libraries_to_arguments()
@ceedling[:generator].generate_executable_file(
TOOLS_TEST_LINKER,
@@ -67,6 +66,7 @@ namespace TEST_SYM do
@ceedling[:file_finder].find_test_from_file_path(test)
end
]) do |test|
@ceedling[:rake_wrapper][:directories].reenable if @ceedling[:task_invoker].first_run == false && @ceedling[:project_config_manager].test_defines_changed
@ceedling[:rake_wrapper][:directories].invoke
@ceedling[:test_invoker].setup_and_invoke([test.source])
end

View File

@@ -1,8 +1,16 @@
class StreamWrapper
def stdout_override(&fnc)
@stdout_overide_fnc = fnc
end
def stdout_puts(string)
$stdout.puts(string)
if @stdout_overide_fnc
@stdout_overide_fnc.call(string)
else
$stdout.puts(string)
end
end
def stdout_flush

View File

@@ -2,11 +2,14 @@ require 'ceedling/par_map'
class TaskInvoker
constructor :dependinator, :rake_utils, :rake_wrapper
attr_accessor :first_run
constructor :dependinator, :rake_utils, :rake_wrapper, :project_config_manager
def setup
@test_regexs = [/^#{TEST_ROOT_NAME}:/]
@release_regexs = [/^#{RELEASE_ROOT_NAME}(:|$)/]
@first_run = true
end
def add_test_task_regex(regex)
@@ -46,17 +49,22 @@ class TaskInvoker
def invoke_test_mocks(mocks)
@dependinator.enhance_mock_dependencies( mocks )
mocks.each { |mock| @rake_wrapper[mock].invoke }
mocks.each { |mock|
@rake_wrapper[mock].reenable if @first_run == false && @project_config_manager.test_defines_changed
@rake_wrapper[mock].invoke
}
end
def invoke_test_runner(runner)
@dependinator.enhance_runner_dependencies( runner )
@rake_wrapper[runner].reenable if @first_run == false && @project_config_manager.test_defines_changed
@rake_wrapper[runner].invoke
end
def invoke_test_shallow_include_lists(files)
@dependinator.enhance_shallow_include_lists_dependencies( files )
par_map(PROJECT_COMPILE_THREADS, files) do |file|
@rake_wrapper[file].reenable if @first_run == false && @project_config_manager.test_defines_changed
@rake_wrapper[file].invoke
end
end
@@ -64,6 +72,7 @@ class TaskInvoker
def invoke_test_preprocessed_files(files)
@dependinator.enhance_preprocesed_file_dependencies( files )
par_map(PROJECT_COMPILE_THREADS, files) do |file|
@rake_wrapper[file].reenable if @first_run == false && @project_config_manager.test_defines_changed
@rake_wrapper[file].invoke
end
end
@@ -71,30 +80,37 @@ class TaskInvoker
def invoke_test_dependencies_files(files)
@dependinator.enhance_dependencies_dependencies( files )
par_map(PROJECT_COMPILE_THREADS, files) do |file|
@rake_wrapper[file].reenable if @first_run == false && @project_config_manager.test_defines_changed
@rake_wrapper[file].invoke
end
end
def invoke_test_objects(objects)
par_map(PROJECT_COMPILE_THREADS, objects) do |object|
@rake_wrapper[object].invoke
@rake_wrapper[object].reenable if @first_run == false && @project_config_manager.test_defines_changed
@rake_wrapper[object].invoke
end
end
def invoke_test_executable(file)
@rake_wrapper[file].invoke
end
def invoke_test_results(result)
@dependinator.enhance_results_dependencies( result )
@rake_wrapper[result].reenable if @first_run == false && @project_config_manager.test_defines_changed
@rake_wrapper[result].invoke
end
def invoke_release_dependencies_files(files)
par_map(PROJECT_COMPILE_THREADS, files) do |file|
@rake_wrapper[file].invoke
@rake_wrapper[file].invoke
end
end
def invoke_release_objects(objects)
par_map(PROJECT_COMPILE_THREADS, objects) do |object|
@rake_wrapper[object].invoke
@rake_wrapper[object].invoke
end
end

View File

@@ -89,7 +89,6 @@ namespace :options do
desc "Merge #{option} project options."
task option.downcase.to_sym do
# @ceedling[:setupinator].reset_defaults( @ceedling[:setupinator].config_hash )
hash = @ceedling[:project_config_manager].merge_options( @ceedling[:setupinator].config_hash, option_path )
@ceedling[:setupinator].do_setup( hash )
if @ceedling[:configurator].project_release_build

View File

@@ -81,7 +81,10 @@ namespace :files do
['source', COLLECTION_ALL_SOURCE],
['header', COLLECTION_ALL_HEADERS]
]
categories << ['assembly', COLLECTION_ALL_ASSEMBLY] if (RELEASE_BUILD_USE_ASSEMBLY)
using_assembly = (defined?(TEST_BUILD_USE_ASSEMBLY) && TEST_BUILD_USE_ASSEMBLY) ||
(defined?(RELEASE_BUILD_USE_ASSEMBLY) && RELEASE_BUILD_USE_ASSEMBLY)
categories << ['assembly', COLLECTION_ALL_ASSEMBLY] if using_assembly
categories.each do |category|
name = category[0]

View File

@@ -1,7 +1,7 @@
require 'ceedling/constants'
task :test => [:directories] do
@ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS)
Rake.application['test:all'].invoke
end
namespace TEST_SYM do
@@ -25,6 +25,11 @@ namespace TEST_SYM do
@ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS, TEST_SYM, {:force_run => false})
end
desc "Just build tests without running."
task :build_only => [:directories] do
@ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS, TEST_SYM, {:build_only => true})
end
desc "Run tests by matching regular expression pattern."
task :pattern, [:regex] => [:directories] do |t, args|
matches = []

View File

@@ -54,7 +54,20 @@ class TestInvoker
end
end
def setup_and_invoke(tests, context=TEST_SYM, options={:force_run => true})
# Convert libraries configuration form YAML configuration
# into a string that can be given to the compiler.
def convert_libraries_to_arguments()
if @configurator.project_config_hash.has_key?(:libraries_test)
lib_args = @configurator.project_config_hash[:libraries_test]
lib_args.flatten!
lib_flag = @configurator.project_config_hash[:libraries_flag]
lib_args.map! {|v| lib_flag.gsub(/\$\{1\}/, v) } if (defined? lib_flag)
return lib_args
end
end
def setup_and_invoke(tests, context=TEST_SYM, options={:force_run => true, :build_only => false})
@tests = tests
@@ -68,7 +81,7 @@ class TestInvoker
begin
@plugin_manager.pre_test( test )
test_name ="#{File.basename(test)}".chomp('.c')
def_test_key="defines_#{test_name}"
def_test_key="defines_#{test_name.downcase}"
# Re-define the project out path and pre-processor defines.
if @configurator.project_config_hash.has_key?(def_test_key.to_sym)
@@ -94,6 +107,8 @@ class TestInvoker
results_pass = @file_path_utils.form_pass_results_filepath( test )
results_fail = @file_path_utils.form_fail_results_filepath( test )
@project_config_manager.process_test_defines_change(sources)
# add the definition value in the build option for the unit test
if @configurator.defines_use_test_definition
add_test_definition(test)
@@ -119,8 +134,15 @@ class TestInvoker
# build test objects
@task_invoker.invoke_test_objects( objects )
# 3, 2, 1... launch
@task_invoker.invoke_test_results( results_pass )
# if the option build_only has been specified, build only the executable
# but don't run the test
if (options[:build_only])
executable = @file_path_utils.form_test_executable_filepath( test )
@task_invoker.invoke_test_executable( executable )
else
# 3, 2, 1... launch
@task_invoker.invoke_test_results( results_pass )
end
rescue => e
@build_invoker_utils.process_exception( e, context )
ensure
@@ -142,6 +164,8 @@ class TestInvoker
# store away what's been processed
@mocks.concat( mock_list )
@sources.concat( sources )
@task_invoker.first_run = false
end
# post-process collected mock list

View File

@@ -18,6 +18,8 @@ class ToolExecutor
end
# build up a command line from yaml provided config
# @param extra_params is an array of parameters to append to executable
def build_command_line(tool_config, extra_params, *args)
@tool_name = tool_config[:name]
@executable = tool_config[:executable]
@@ -50,7 +52,6 @@ class ToolExecutor
options[:boom] = true if (options[:boom].nil?)
options[:stderr_redirect] = StdErrRedirect::NONE if (options[:stderr_redirect].nil?)
options[:background_exec] = BackgroundExec::NONE if (options[:background_exec].nil?)
# build command line
command_line = [
@tool_executor_helper.background_exec_cmdline_prepend( options ),
@@ -60,6 +61,8 @@ class ToolExecutor
@tool_executor_helper.background_exec_cmdline_append( options ),
].flatten.compact.join(' ')
@streaminator.stderr_puts("Verbose: #{__method__.to_s}(): #{command_line}", Verbosity::DEBUG)
shell_result = {}
# depending on background exec option, we shell out differently
@@ -73,7 +76,10 @@ class ToolExecutor
shell_result[:time] = time
#scrub the string for illegal output
shell_result[:output].scrub! unless (!("".respond_to? :scrub!) || (shell_result[:output].nil?))
unless shell_result[:output].nil?
shell_result[:output] = shell_result[:output].scrub if "".respond_to?(:scrub)
shell_result[:output].gsub!(/\033\[\d\dm/,'')
end
@tool_executor_helper.print_happy_results( command_line, shell_result, options[:boom] )
@tool_executor_helper.print_error_results( command_line, shell_result, options[:boom] )

View File

@@ -1,15 +1,36 @@
# @private
module Ceedling
module Version
# @private
GEM = "0.28.3"
# @private
# Check for local or global version of vendor directory in order to look up versions
{
"CEXCEPTION" => File.join("vendor","c_exception","lib","CException.h"),
"CMOCK" => File.join("vendor","cmock","src","cmock.h"),
"UNITY" => File.join("vendor","unity","src","unity.h"),
}.each_pair do |name, path|
filename = if (File.exist?(File.join("..","..",path)))
File.join("..","..",path)
elsif (File.exist?(File.join(File.dirname(__FILE__),"..","..",path)))
File.join(File.dirname(__FILE__),"..","..",path)
else
eval "#{name} = 'unknown'"
continue
end
# Actually look up the versions
a = [0,0,0]
File.readlines(filename) do |line|
["VERSION_MAJOR", "VERSION_MINOR", "VERSION_BUILD"].each_with_index do |field, i|
m = line.match(/#{name}_#{field}\s+(\d+)/)
a[i] = m[1] unless (m.nil?)
end
end
# Make a constant from each, so that we can use it elsewhere
eval "#{name} = '#{a.join(".")}'"
end
GEM = "0.29.0"
CEEDLING = GEM
# @private
CEXCEPTION = "1.3.1"
# @private
CMOCK = "2.4.5"
# @private
UNITY = "2.4.2"
end
end