diff --git a/.gitignore b/.gitignore index 47dec9c..50f183a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ test/system/generated Gemfile.lock .rake_t_cache .DS_Store +*.swp examples/make_example/build diff --git a/docs/CMock_Summary.md b/docs/CMock_Summary.md index 22a40b0..58a9b0f 100644 --- a/docs/CMock_Summary.md +++ b/docs/CMock_Summary.md @@ -287,6 +287,10 @@ Defined in the yaml file, they look more like this: * `:mock_suffix`: The suffix to append to your mock files. Defaults to “”. +* `:weak`: + When set to some value, the generated mocks are defined as weak symbols using the configured format. Defaults to ''. + Set to '__attribute ((weak))' for weak mocks when using GCC. Set to any non-empty string for weak mocks when using IAR. + * `:subdir`: Relative subdir for your mocks. Set this to e.g. "sys" in order to create mock for `sys/types.h` in `:mock_path`/sys/ diff --git a/lib/cmock_config.rb b/lib/cmock_config.rb index 7b15858..2fcc305 100644 --- a/lib/cmock_config.rb +++ b/lib/cmock_config.rb @@ -12,6 +12,7 @@ class CMockConfig :mock_path => 'mocks', :mock_prefix => 'Mock', :mock_suffix => '', + :weak => '', :subdir => nil, :plugins => [], :strippables => ['(?:__attribute__\s*\(+.*?\)+)'], diff --git a/lib/cmock_generator.rb b/lib/cmock_generator.rb index a1fb00a..58b3fa6 100644 --- a/lib/cmock_generator.rb +++ b/lib/cmock_generator.rb @@ -6,7 +6,7 @@ class CMockGenerator - attr_accessor :config, :file_writer, :module_name, :clean_mock_name, :mock_name, :utils, :plugins, :ordered + attr_accessor :config, :file_writer, :module_name, :clean_mock_name, :mock_name, :utils, :plugins, :weak, :ordered def initialize(config, file_writer, utils, plugins) @file_writer = file_writer @@ -15,6 +15,7 @@ class CMockGenerator @config = config @prefix = @config.mock_prefix @suffix = @config.mock_suffix + @weak = @config.weak @ordered = @config.enforce_strict_ordering @framework = @config.framework.to_s @@ -211,6 +212,13 @@ class CMockGenerator args_string += (", " + function[:var_arg]) unless (function[:var_arg].nil?) # Create mock function + if (not @weak.empty?) + file << "#if defined (__IAR_SYSTEMS_ICC__)\n" + file << "#pragma weak #{function[:name]}\n" + file << "#else\n" + file << "#{function_mod_and_rettype} #{function[:name]}(#{args_string}) #{weak};\n" + file << "#endif\n\n" + end file << "#{function_mod_and_rettype} #{function[:name]}(#{args_string})\n" file << "{\n" file << " UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM;\n" diff --git a/test/unit/cmock_generator_main_test.rb b/test/unit/cmock_generator_main_test.rb index 038fcfd..81d7bfb 100644 --- a/test/unit/cmock_generator_main_test.rb +++ b/test/unit/cmock_generator_main_test.rb @@ -44,6 +44,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do #no strict handling @config.expect :mock_prefix, "Mock" @config.expect :mock_suffix, "" + @config.expect :weak, "" @config.expect :enforce_strict_ordering, nil @config.expect :framework, :unity @config.expect :includes, ["ConfigRequiredHeader1.h","ConfigRequiredHeader2.h"] @@ -60,6 +61,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do #strict handling @config.expect :mock_prefix, "Mock" @config.expect :mock_suffix, "" + @config.expect :weak, "" @config.expect :enforce_strict_ordering, true @config.expect :framework, :unity @config.expect :includes, nil @@ -80,6 +82,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do it "create the top of a header file with optional include files from config and include file from plugin" do @config.expect :mock_prefix, "Mock" @config.expect :mock_suffix, "" + @config.expect :weak, "" orig_filename = "PoutPoutFish.h" define_name = "MOCKPOUTPOUTFISH_H" mock_name = "MockPoutPoutFish" @@ -116,6 +119,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do #no strict handling @config.expect :mock_prefix, "Mock" @config.expect :mock_suffix, "" + @config.expect :weak, "" @config.expect :enforce_strict_ordering, nil @config.expect :framework, :unity @config.expect :includes, ["ConfigRequiredHeader1.h","ConfigRequiredHeader2.h"] @@ -130,6 +134,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do @config.expect :mock_prefix, "Mock" @config.expect :mock_suffix, "" + @config.expect :weak, "" orig_filename = "Pout-Pout Fish.h" define_name = "MOCKPOUT_POUT_FISH_H" mock_name = "MockPout_Pout_Fish" @@ -165,6 +170,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do it "create the top of a header file with optional include files from config" do @config.expect :mock_prefix, "Mock" @config.expect :mock_suffix, "" + @config.expect :weak, "" orig_filename = "PoutPoutFish.h" define_name = "MOCKPOUTPOUTFISH_H" mock_name = "MockPoutPoutFish" @@ -199,6 +205,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do it "create the top of a header file with include file from plugin" do @config.expect :mock_prefix, "Mock" @config.expect :mock_suffix, "" + @config.expect :weak, "" orig_filename = "PoutPoutFish.h" define_name = "MOCKPOUTPOUTFISH_H" mock_name = "MockPoutPoutFish"