ceedling 1.1.10 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +3 -0
- data/.simplecov +73 -0
- data/GIT_COMMIT_SHA +1 -1
- data/Gemfile +84 -8
- data/Gemfile.lock +38 -8
- data/README.md +51 -29
- data/Rakefile +768 -16
- data/assets/{project.yml → features/project.yml} +4 -1
- data/assets/fixtures/bullseye_branch_coverage/src/branchy.c +24 -0
- data/assets/fixtures/bullseye_branch_coverage/src/branchy.h +14 -0
- data/assets/fixtures/bullseye_branch_coverage/test/test_branchy.c +18 -0
- data/assets/fixtures/cppcheck_findings/findings.c +23 -0
- data/assets/fixtures/cppcheck_findings/findings.h +13 -0
- data/assets/fixtures/header_include_path_validation/alt_drivers/foo.h +6 -0
- data/assets/fixtures/header_include_path_validation/bar.h +6 -0
- data/assets/fixtures/header_include_path_validation/drivers/foo.h +6 -0
- data/assets/fixtures/header_include_path_validation/dup.h +6 -0
- data/assets/fixtures/header_include_path_validation/other_inc/dup.h +6 -0
- data/assets/fixtures/header_include_path_validation/test_ambiguous_mock.c +15 -0
- data/assets/fixtures/header_include_path_validation/test_bare_mock.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_bogus_mock_path.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_bogus_vanilla_path.c +10 -0
- data/assets/fixtures/header_include_path_validation/test_include_outranks_test_include_path.c +16 -0
- data/assets/fixtures/header_include_path_validation/test_pathed_mock.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_pathed_mock_ambiguous.c +14 -0
- data/assets/fixtures/header_include_path_validation/test_test_include_path_outranks_include.c +17 -0
- data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.h +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/beta/dup.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/beta/dup.h +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/gamma/dup_gamma.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_alpha.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_bare.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_beta.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_override.c +19 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive.c +19 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive_noop.c +16 -0
- data/assets/fixtures/parent_directory_references/alpha/extra.c +4 -0
- data/assets/fixtures/parent_directory_references/common/helper.c +6 -0
- data/assets/fixtures/parent_directory_references/common/helper.h +6 -0
- data/assets/fixtures/parent_directory_references/unit/test_dotdot_include.c +10 -0
- data/assets/fixtures/parent_directory_references/unit/test_dotdot_source.c +16 -0
- data/assets/fixtures/plain_inline_module.h +9 -0
- data/assets/fixtures/same_named_modules/include/drivers/spi/config.h +6 -0
- data/assets/fixtures/same_named_modules/include/drivers/uart/config.h +6 -0
- data/assets/fixtures/same_named_modules/src/drivers/spi/config.c +8 -0
- data/assets/fixtures/same_named_modules/src/drivers/uart/config.c +10 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs.c +26 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs_mocked.c +20 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs_mocked_traditional.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_both_modules.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_uart_config_bare.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_uart_config_partial_only.c +20 -0
- data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.c +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.h +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.c +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.h +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/main.c +11 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_baz_bar.c +10 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_both_bars.c +12 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_foo_bar.c +10 -0
- data/assets/{test_example_file_boom.c → fixtures/test_nosanitize_boom.c} +9 -0
- data/assets/{test_example_file_crash_assert.c → fixtures/test_nosanitize_crash_assert.c} +8 -0
- data/assets/{test_example_file_crash_sigsegv.c → fixtures/test_nosanitize_crash_sigsegv.c} +8 -0
- data/assets/{test_example_file_crash_sigsegv_with_param.c → fixtures/test_nosanitize_crash_sigsegv_with_param.c} +8 -0
- data/assets/fixtures/test_nosanitize_heap_buffer_overflow.c +31 -0
- data/assets/fixtures/test_nosanitize_leak.c +34 -0
- data/assets/fixtures/test_nosanitize_two_findings.c +36 -0
- data/assets/{test_example_file_ub_shift_overflow.c → fixtures/test_nosanitize_ub_shift_overflow.c} +9 -0
- data/assets/fixtures/test_plain_inline_module.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/alpha/calc.c +4 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/beta/calc.c +4 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_alpha.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_ambiguous.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_beta.c +15 -0
- data/assets/fixtures/tests_with_conditional_includes/src/feature_extra2.h +13 -0
- data/assets/fixtures/tests_with_conditional_includes/src/macro_target_extra.h +13 -0
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.c +19 -3
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.h +1 -0
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.c +17 -1
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget.c +12 -4
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget_feature.c +8 -5
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.c +7 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.c +16 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/FeatureConfig.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Gpt.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModuleConfig.h +17 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart1.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart2.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/drivers/widget.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/reader.c +7 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/reader.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01.c +21 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01_legacy.c +16 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_02.c +31 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_FeatureConfig.c +15 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_reader.c +13 -0
- data/assets/fixtures/tests_with_duplicate_test_names/integration/test_foo.c +21 -0
- data/assets/fixtures/tests_with_duplicate_test_names/unit/test_foo.c +21 -0
- data/assets/fixtures/tests_with_fallback_conditionals/src/conditional_module.c +28 -0
- data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/test/test_conditionals.c +8 -1
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_lower.s +2 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_upper.S +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.c +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.h +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/test/test_counter_module.c +27 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/app/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/drivers/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.c +30 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/shared/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/test/test_sensor.c +32 -0
- data/bin/actionator.rb +234 -0
- data/bin/app_cfg.rb +7 -0
- data/bin/cli.rb +78 -47
- data/bin/cli_handler.rb +89 -57
- data/bin/cli_helper.rb +90 -49
- data/bin/cli_options_transform.rb +22 -0
- data/bin/{configinator.rb → composinator.rb} +39 -32
- data/bin/mixin_resolvinator.rb +124 -0
- data/bin/mixin_standardizer.rb +31 -61
- data/bin/mixinator.rb +27 -29
- data/bin/mixins.rb +0 -5
- data/bin/objects.yml +20 -7
- data/bin/path_validator.rb +6 -5
- data/bin/projectinator.rb +51 -142
- data/bin/rake_patches.rb +36 -2
- data/bin/recursive_merger.rb +7 -1
- data/bin/versionator.rb +2 -3
- data/ceedling.gemspec +83 -12
- data/docs/BreakingChanges.md +46 -2
- data/docs/CONTRIBUTING.md +45 -29
- data/docs/CeedlingPullRequestChecklist.md +10 -9
- data/docs/Changelog.md +327 -37
- data/docs/KnownIssues.md +30 -4
- data/docs/ReleaseNotes.md +288 -12
- data/docs/SECURITY.md +46 -2
- data/docs/ThrowTheSwitchCodingStandard.md +21 -3
- data/docs/overrides/main.html +32 -0
- data/examples/temp_sensor/mixin/add_bullseye.yml +19 -0
- data/examples/wondrous_forest/README.md +3 -0
- data/examples/wondrous_forest/src/sensors/light/Calibration.c +21 -0
- data/examples/wondrous_forest/src/sensors/light/Calibration.h +14 -0
- data/examples/wondrous_forest/src/sensors/soil/Calibration.c +23 -0
- data/examples/wondrous_forest/src/sensors/soil/Calibration.h +14 -0
- data/examples/wondrous_forest/test/TestCalibration.c +39 -0
- data/lib/ceedling/batchinator.rb +81 -22
- data/lib/ceedling/c_extractor/README.md +61 -0
- data/lib/ceedling/c_extractor/c_extractor.rb +33 -2
- data/lib/ceedling/c_extractor/c_extractor_code_text.rb +18 -10
- data/lib/ceedling/c_extractor/c_extractor_constants.rb +10 -10
- data/lib/ceedling/c_extractor/c_extractor_declarations.rb +14 -14
- data/lib/ceedling/c_extractor/c_extractor_functions.rb +10 -13
- data/lib/ceedling/c_extractor/c_extractor_preprocessing.rb +77 -0
- data/lib/ceedling/c_extractor/c_extractor_types.rb +8 -5
- data/lib/ceedling/ceedling.h +33 -0
- data/lib/ceedling/config/config_matchinator.rb +36 -13
- data/lib/ceedling/config/configurator.rb +366 -530
- data/lib/ceedling/config/configurator_builder.rb +253 -365
- data/lib/ceedling/config/configurator_plugins.rb +68 -102
- data/lib/ceedling/config/configurator_setup.rb +343 -610
- data/lib/ceedling/config/configurator_validator.rb +114 -142
- data/lib/ceedling/config/line_marker_suppressors.rb +67 -0
- data/lib/ceedling/constants.rb +60 -6
- data/lib/ceedling/defaults.rb +28 -14
- data/lib/ceedling/defineinator.rb +9 -4
- data/lib/ceedling/dependencies/README.md +69 -0
- data/lib/ceedling/dependencies/dependency_cache_store.rb +160 -0
- data/lib/ceedling/dependencies/dependency_debug_tree.rb +129 -0
- data/lib/ceedling/dependencies/dependency_differ.rb +127 -0
- data/lib/ceedling/dependencies/dependency_hasher.rb +94 -0
- data/lib/ceedling/dependencies/dependency_path_normalizer.rb +80 -0
- data/lib/ceedling/dependencies/dependency_tracker.rb +405 -0
- data/lib/ceedling/dependencies/dependinator.rb +65 -0
- data/lib/ceedling/dependencies/gcc_dependency_parser.rb +86 -0
- data/lib/ceedling/encodinator.rb +23 -11
- data/lib/ceedling/file_finder.rb +373 -89
- data/lib/ceedling/file_finder_helper.rb +44 -33
- data/lib/ceedling/file_path_collection_utils.rb +17 -4
- data/lib/ceedling/file_path_utils.rb +310 -52
- data/lib/ceedling/file_wrapper.rb +245 -8
- data/lib/ceedling/filename_extension.rb +91 -0
- data/lib/ceedling/flaginator.rb +6 -2
- data/lib/ceedling/generators/generator.rb +192 -70
- data/lib/ceedling/generators/generator_helper.rb +116 -69
- data/lib/ceedling/generators/generator_mocks.rb +13 -8
- data/lib/ceedling/generators/generator_partials.rb +47 -15
- data/lib/ceedling/generators/generator_test_results.rb +29 -17
- data/lib/ceedling/generators/generator_test_results_backtrace.rb +199 -107
- data/lib/ceedling/generators/generator_test_results_sanity_checker.rb +1 -1
- data/lib/ceedling/includes/include_factory.rb +21 -6
- data/lib/ceedling/includes/include_pathinator.rb +40 -4
- data/lib/ceedling/includes/includes.rb +215 -61
- data/lib/ceedling/loginator.rb +13 -4
- data/lib/ceedling/objects.yml +216 -33
- data/lib/ceedling/parsing_parcels.rb +39 -13
- data/lib/ceedling/partials/README.md +53 -0
- data/lib/ceedling/partials/partializer.rb +118 -26
- data/lib/ceedling/partials/partializer_config.rb +141 -8
- data/lib/ceedling/partials/partializer_helper.rb +88 -2
- data/lib/ceedling/partials/partializer_utils.rb +1 -1
- data/lib/ceedling/partials/partials.rb +4 -4
- data/lib/ceedling/path_matcher.rb +163 -0
- data/lib/ceedling/path_mirror.rb +73 -0
- data/lib/ceedling/plugins/plugin.rb +1 -1
- data/lib/ceedling/plugins/plugin_manager.rb +31 -15
- data/lib/ceedling/plugins/plugin_manager_helper.rb +5 -1
- data/lib/ceedling/plugins/plugin_reportinator.rb +36 -7
- data/lib/ceedling/plugins/plugin_reportinator_helper.rb +3 -3
- data/lib/ceedling/plugins/report_log_writer_plugin.rb +66 -0
- data/lib/ceedling/plugins/report_tests_stdout_plugin.rb +18 -5
- data/lib/ceedling/preprocess/README.md +135 -120
- data/lib/ceedling/preprocess/c_comment_scanner.rb +9 -7
- data/lib/ceedling/preprocess/c_preprocessor_conditionals.rb +27 -10
- data/lib/ceedling/preprocess/preprocessinator.rb +253 -217
- data/lib/ceedling/preprocess/preprocessinator_bare_includes_extractor.rb +7 -10
- data/lib/ceedling/preprocess/preprocessinator_code_finder.rb +8 -6
- data/lib/ceedling/preprocess/preprocessinator_comment_stripper.rb +5 -3
- data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +86 -82
- data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +182 -163
- data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +174 -8
- data/lib/ceedling/preprocess/preprocessinator_reconstructor.rb +41 -20
- data/lib/ceedling/quote_include_isolator.rb +129 -0
- data/lib/ceedling/rake_app/rake_task_registry.rb +9 -9
- data/lib/ceedling/rake_app/rake_wrapper.rb +0 -13
- data/lib/ceedling/rake_app/rakefile_component_resolver.rb +24 -12
- data/lib/ceedling/rakefile.rb +2 -1
- data/lib/ceedling/{tasks_base.rake → rakefiles/base/tasks_base.rake} +1 -1
- data/lib/ceedling/{tasks_filesystem.rake → rakefiles/base/tasks_filesystem.rake} +3 -0
- data/lib/ceedling/rakefiles/release/rules_release.rake +52 -0
- data/lib/ceedling/{erb_wrapper.rb → rakefiles/release/tasks_release.rake} +5 -8
- data/lib/ceedling/rakefiles/tests/rules_tests.rake +43 -0
- data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +80 -0
- data/lib/ceedling/{tasks_tests.rake → rakefiles/tests/tasks_tests.rake} +11 -20
- data/lib/ceedling/rakefiles/tests/tasks_tests_generate.rake +55 -0
- data/lib/ceedling/release_invoker/README.md +35 -0
- data/lib/ceedling/release_invoker/release_build_executor.rb +263 -0
- data/lib/ceedling/release_invoker/release_build_planner.rb +80 -0
- data/lib/ceedling/release_invoker/release_invoker.rb +78 -0
- data/lib/ceedling/release_invoker/release_invoker_types.rb +40 -0
- data/lib/ceedling/reportinator.rb +18 -2
- data/lib/ceedling/ruby_expandinator.rb +40 -1
- data/lib/ceedling/setupinator.rb +9 -3
- data/lib/ceedling/system_wrapper.rb +17 -0
- data/lib/ceedling/templateinator.rb +146 -0
- data/lib/ceedling/test_context_extractor.rb +59 -28
- data/lib/ceedling/test_invoker/HEADER_COLLISIONS.md +41 -0
- data/lib/ceedling/test_invoker/PIPELINE.md +142 -0
- data/lib/ceedling/test_invoker/README.md +6 -0
- data/lib/ceedling/test_invoker/mock_locator.rb +49 -0
- data/lib/ceedling/test_invoker/partials_manager.rb +426 -0
- data/lib/ceedling/test_invoker/standin_headerinator.rb +136 -0
- data/lib/ceedling/test_invoker/test_bare_includes_extractinator.rb +117 -0
- data/lib/ceedling/test_invoker/test_build_executor.rb +783 -429
- data/lib/ceedling/test_invoker/test_build_planner.rb +175 -70
- data/lib/ceedling/test_invoker/test_build_setup.rb +132 -241
- data/lib/ceedling/test_invoker/test_build_validations.rb +102 -0
- data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +148 -0
- data/lib/ceedling/test_invoker/test_includes_extractinator.rb +34 -0
- data/lib/ceedling/test_invoker/test_includes_preprocessinator.rb +118 -0
- data/lib/ceedling/test_invoker/test_includes_reconcilinator.rb +149 -0
- data/lib/ceedling/test_invoker/test_invoker.rb +16 -183
- data/lib/ceedling/test_invoker/test_invoker_types.rb +85 -16
- data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +121 -0
- data/lib/ceedling/test_invoker/test_pipeline_manager.rb +303 -0
- data/lib/ceedling/test_invoker/test_runner_generatinator.rb +105 -0
- data/lib/ceedling/test_invoker/test_search_paths.rb +73 -0
- data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +78 -0
- data/lib/ceedling/tool_executor.rb +42 -13
- data/lib/ceedling/tool_executor_helper.rb +1 -1
- data/lib/ceedling/tool_validator.rb +124 -123
- data/lib/ceedling/yaml_wrapper.rb +5 -3
- data/lib/version.rb +19 -2
- data/mkdocs.prerelease.yml +42 -0
- data/mkdocs.yml +10 -2
- data/plugins/bullseye/bullseye.rake +70 -107
- data/plugins/bullseye/config/defaults.yml +12 -54
- data/plugins/bullseye/config/defaults_bullseye.rb +182 -0
- data/plugins/bullseye/lib/bullseye.rb +511 -120
- data/plugins/bullseye/lib/bullseye_constants.rb +100 -0
- data/plugins/command_hooks/lib/command_hooks.rb +117 -199
- data/plugins/compile_commands_json_db/lib/compile_commands_json_db.rb +72 -27
- data/plugins/cppcheck/config/defaults.yml +6 -1
- data/plugins/cppcheck/config/defaults_cppcheck.rb +5 -1
- data/plugins/cppcheck/cppcheck.rake +7 -1
- data/plugins/cppcheck/lib/cppcheck.rb +175 -26
- data/plugins/cppcheck/lib/cppcheck_constants.rb +12 -0
- data/plugins/cppcheck/lib/cppcheck_reports.rb +5 -1
- data/plugins/dependencies/Rakefile +14 -2
- data/plugins/dependencies/config/defaults.yml +9 -6
- data/plugins/dependencies/dependencies.rake +46 -76
- data/plugins/dependencies/example/boss/project.yml +1 -1
- data/plugins/dependencies/example/supervisor/project.yml +1 -1
- data/plugins/dependencies/example/version.tar.gzip +0 -0
- data/plugins/dependencies/lib/dependencies.rb +232 -427
- data/plugins/dependencies/lib/dependency_commands.rb +72 -0
- data/plugins/dependencies/lib/dependency_environment.rb +57 -0
- data/plugins/dependencies/lib/dependency_spec.rb +145 -0
- data/plugins/fff/.rspec +1 -0
- data/plugins/fff/Rakefile +14 -2
- data/plugins/fff/examples/fff_example/project.yml +1 -1
- data/plugins/fff/lib/fff.rb +30 -9
- data/plugins/fff/lib/fff_mock_generator.rb +142 -128
- data/plugins/fff/spec/fff_mock_header_generator_spec.rb +15 -0
- data/plugins/fff/spec/fff_mock_source_generator_spec.rb +14 -0
- data/plugins/fff/spec/spec_helper.rb +45 -0
- data/plugins/fff/src/fff_unity_helper.h +5 -0
- data/plugins/fff/vendor/fff/fakegen.rb +5 -4
- data/plugins/fff/vendor/fff/fff.h +4 -4
- data/plugins/gcov/config/defaults.yml +5 -0
- data/plugins/gcov/gcov.rake +12 -8
- data/plugins/gcov/lib/console_reportinator.rb +140 -20
- data/plugins/gcov/lib/gcov.rb +155 -60
- data/plugins/gcov/lib/gcov_constants.rb +4 -7
- data/plugins/gcov/lib/gcov_reportinator.rb +90 -0
- data/plugins/gcov/lib/gcov_types.rb +62 -1
- data/plugins/gcov/lib/gcovr_reportinator.rb +255 -213
- data/plugins/gcov/lib/reportgenerator_reportinator.rb +122 -44
- data/plugins/module_generator/Rakefile +4 -4
- data/plugins/module_generator/config/module_generator.yml +0 -1
- data/plugins/module_generator/example/project.yml +1 -1
- data/plugins/module_generator/lib/module_generator.rb +117 -87
- data/plugins/module_generator/lib/module_generator_options.rb +150 -0
- data/plugins/module_generator/lib/module_generator_project.rb +45 -0
- data/plugins/module_generator/lib/module_generator_request.rb +83 -0
- data/plugins/module_generator/lib/module_generator_test_file.rb +68 -0
- data/plugins/module_generator/lib/module_generator_unity.rb +24 -0
- data/plugins/module_generator/module_generator.rake +24 -46
- data/plugins/report_build_warnings_log/config/defaults.yml +4 -1
- data/plugins/report_build_warnings_log/lib/report_build_warnings_log.rb +47 -55
- data/plugins/report_build_warnings_log/lib/warning_collector.rb +140 -0
- data/plugins/report_build_warnings_log/lib/warning_reports.rb +135 -0
- data/plugins/report_tests_gtestlike_stdout/assets/test_results.template +3 -0
- data/{spec/units/configurator_builder_spec.rb → plugins/report_tests_gtestlike_stdout/config/defaults.yml} +6 -10
- data/plugins/report_tests_gtestlike_stdout/lib/gtestlike_report.rb +168 -0
- data/plugins/report_tests_gtestlike_stdout/lib/report_tests_gtestlike_stdout.rb +25 -1
- data/plugins/report_tests_ide_stdout/assets/test_results.template +50 -0
- data/plugins/report_tests_ide_stdout/config/defaults.yml +13 -0
- data/plugins/report_tests_ide_stdout/lib/ide_report_lines.rb +103 -0
- data/plugins/report_tests_ide_stdout/lib/report_tests_ide_stdout.rb +12 -4
- data/plugins/report_tests_log_factory/lib/cppunit_tests_reporter.rb +33 -51
- data/plugins/report_tests_log_factory/lib/html_tests_reporter.rb +286 -295
- data/plugins/report_tests_log_factory/lib/json_tests_reporter.rb +22 -35
- data/plugins/report_tests_log_factory/lib/junit_tests_reporter.rb +91 -133
- data/plugins/report_tests_log_factory/lib/report_tests_log_factory.rb +72 -86
- data/plugins/report_tests_log_factory/lib/tests_reporter.rb +31 -12
- data/plugins/report_tests_pretty_stdout/assets/{template.erb → test_results.template} +8 -8
- data/plugins/report_tests_raw_output_log/lib/report_tests_raw_output_log.rb +18 -48
- data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +13 -2
- data/plugins/sanitize/config/defaults.yml +44 -0
- data/plugins/sanitize/config/defaults_sanitize.rb +20 -0
- data/plugins/sanitize/lib/sanitize.rb +174 -0
- data/plugins/sanitize/lib/sanitize_config.rb +110 -0
- data/plugins/sanitize/lib/sanitize_constants.rb +13 -0
- data/plugins/sanitize/lib/sanitize_findings.rb +85 -0
- data/plugins/sanitize/lib/sanitize_records.rb +115 -0
- data/plugins/sanitize/lib/sanitize_reports.rb +135 -0
- data/plugins/sanitize/sanitize.rake +108 -0
- data/plugins/valgrind/config/defaults.yml +7 -1
- data/plugins/valgrind/config/defaults_valgrind.rb +6 -1
- data/plugins/valgrind/lib/valgrind.rb +202 -39
- data/plugins/valgrind/lib/valgrind_constants.rb +4 -0
- data/plugins/valgrind/lib/valgrind_report.rb +52 -0
- data/plugins/valgrind/valgrind.rake +33 -11
- data/site-local/404.html +248 -14
- data/site-local/configuration/environment-vars.html +248 -14
- data/site-local/configuration/global-collections.html +248 -19
- data/site-local/configuration/index.html +249 -15
- data/site-local/configuration/loading.html +260 -22
- data/site-local/configuration/mixins.html +252 -17
- data/site-local/configuration/parallel-builds.html +248 -14
- data/site-local/configuration/project-file.html +275 -30
- data/site-local/configuration/reference/cexception.html +255 -20
- data/site-local/configuration/reference/cmock.html +281 -14
- data/site-local/configuration/reference/defines.html +262 -19
- data/site-local/configuration/reference/environment.html +251 -17
- data/site-local/configuration/reference/extension.html +361 -16
- data/site-local/configuration/reference/files.html +262 -14
- data/site-local/configuration/reference/flags.html +270 -19
- data/site-local/configuration/reference/index.html +248 -14
- data/site-local/configuration/reference/libraries.html +248 -14
- data/site-local/configuration/reference/mixins.html +248 -14
- data/site-local/configuration/reference/partials.html +249 -19
- data/site-local/configuration/reference/paths.html +275 -15
- data/site-local/configuration/reference/plugins.html +248 -14
- data/site-local/configuration/reference/project.html +291 -14
- data/site-local/configuration/reference/release-build.html +256 -14
- data/site-local/configuration/reference/test-build.html +290 -24
- data/site-local/configuration/reference/test-runner.html +288 -17
- data/site-local/configuration/reference/tools.html +254 -14
- data/site-local/configuration/reference/unity.html +280 -15
- data/site-local/configuration/which-ceedling.html +248 -14
- data/site-local/development/index.html +254 -14
- data/site-local/development/plugins/configuration.html +269 -17
- data/site-local/development/plugins/index.html +267 -15
- data/site-local/development/plugins/plugin-subclass.html +906 -154
- data/site-local/development/plugins/rake-tasks.html +276 -14
- data/site-local/development/releases.html +4708 -0
- data/site-local/development/workflow.html +1030 -51
- data/site-local/getting-started/builds.html +4607 -0
- data/site-local/getting-started/command-line.html +418 -34
- data/site-local/getting-started/example-projects/cipher-quest.html +248 -14
- data/site-local/getting-started/example-projects/index.html +249 -15
- data/site-local/getting-started/example-projects/temp-sensor.html +248 -14
- data/site-local/getting-started/example-projects/wondrous-forest.html +248 -14
- data/site-local/getting-started/index.html +255 -14
- data/site-local/getting-started/installation.html +258 -22
- data/site-local/getting-started/quick-start.html +251 -15
- data/site-local/help.html +255 -14
- data/site-local/index.html +292 -22
- data/site-local/overview/build-system.html +249 -15
- data/site-local/overview/index.html +248 -14
- data/site-local/overview/test-environments.html +257 -14
- data/site-local/overview/tools-and-frameworks.html +248 -14
- data/site-local/plugins/beep.html +251 -14
- data/site-local/plugins/bullseye/index.html +5079 -0
- data/site-local/plugins/bullseye/licensing.html +4840 -0
- data/site-local/plugins/command-hooks.html +265 -27
- data/site-local/plugins/compile-commands-json-db.html +256 -17
- data/site-local/plugins/cppcheck.html +1081 -262
- data/site-local/plugins/dependencies.html +934 -242
- data/site-local/plugins/fff.html +296 -15
- data/site-local/plugins/gcov/examples.html +251 -14
- data/site-local/plugins/gcov/gcovr.html +567 -65
- data/site-local/plugins/gcov/index.html +251 -14
- data/site-local/plugins/gcov/overview.html +259 -18
- data/site-local/plugins/gcov/reportgenerator.html +386 -38
- data/site-local/plugins/gcov/reporting.html +348 -100
- data/site-local/plugins/gcov/setup.html +253 -15
- data/site-local/plugins/gcov/tool-versions.html +301 -19
- data/site-local/plugins/gcov/troubleshooting.html +273 -36
- data/site-local/plugins/index.html +294 -36
- data/site-local/plugins/module-generator.html +779 -195
- data/site-local/plugins/report-build-warnings-log.html +578 -33
- data/site-local/plugins/report-tests-gtestlike-stdout.html +467 -84
- data/site-local/plugins/report-tests-ide-stdout.html +654 -51
- data/site-local/plugins/report-tests-log-factory.html +337 -70
- data/site-local/plugins/report-tests-pretty-stdout.html +251 -14
- data/site-local/plugins/report-tests-raw-output-log.html +251 -14
- data/site-local/plugins/report-tests-teamcity-stdout.html +251 -14
- data/site-local/plugins/sanitize.html +5332 -0
- data/site-local/plugins/valgrind.html +416 -26
- data/site-local/{plugins/bullseye.html → project/index.html} +297 -217
- data/site-local/project/release-history.html +251 -17
- data/site-local/project/sbom.html +4726 -0
- data/site-local/project/upgrade.html +250 -16
- data/site-local/reference/build-directives.html +257 -14
- data/site-local/reference/command-line.html +373 -16
- data/site-local/reference/environment-vars.html +248 -14
- data/site-local/reference/gcov-plugin.html +492 -18
- data/site-local/reference/global-collections.html +249 -15
- data/site-local/reference/index.html +248 -14
- data/site-local/reference/partials-macros.html +258 -14
- data/site-local/reference/project-configuration.html +248 -14
- data/site-local/sitemap.xml.gz +0 -0
- data/{docs/mkdocs/snapshot/assets → site-local/snapshot/assets/features}/project.yml +4 -1
- data/site-local/snapshot/examples/cipher_quest/index.html +248 -14
- data/site-local/snapshot/examples/temp_sensor/index.html +248 -14
- data/site-local/snapshot/examples/wondrous_forest/index.html +265 -25
- data/site-local/snapshot/plugins/bullseye/config/defaults.yml +24 -0
- data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +182 -0
- data/site-local/snapshot/plugins/gcov/config/defaults.yml +5 -0
- data/site-local/testing-guide/build-directives.html +332 -22
- data/site-local/testing-guide/conventions.html +678 -153
- data/site-local/testing-guide/frameworks.html +248 -14
- data/site-local/testing-guide/index.html +248 -21
- data/site-local/testing-guide/partials/configuration.html +248 -14
- data/site-local/testing-guide/partials/conventions.html +316 -17
- data/site-local/testing-guide/partials/directives.html +456 -48
- data/site-local/testing-guide/partials/example.html +248 -14
- data/site-local/testing-guide/partials/index.html +255 -14
- data/site-local/testing-guide/partials/overview.html +248 -14
- data/site-local/testing-guide/partials/variables.html +248 -14
- data/site-local/testing-guide/test-cases.html +248 -14
- data/site-local/testing-guide/test-sample.html +248 -14
- data/site-local/testing-guide/test-suite-anatomy.html +248 -14
- data/spec/integration/actionator_file_operations_spec.rb +287 -0
- data/spec/integration/analysis_tool_output_spec.rb +204 -0
- data/spec/{units/c_extractor/c_extractor_integration_spec.rb → integration/c_extractor_composition_spec.rb} +196 -17
- data/spec/integration/command_hooks_plugin_spec.rb +152 -0
- data/spec/integration/compile_commands_json_db_spec.rb +76 -0
- data/spec/integration/configurator_pipeline_spec.rb +180 -0
- data/spec/integration/configurator_plugins_spec.rb +122 -0
- data/spec/integration/configurator_validation_spec.rb +98 -0
- data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +396 -0
- data/spec/integration/dependencies/dependency_tracker_core_spec.rb +244 -0
- data/spec/integration/dependencies/dependency_tracker_diagnose_spec.rb +224 -0
- data/spec/integration/dependencies/dependency_tracker_filename_handling_spec.rb +118 -0
- data/spec/integration/dependencies/dependency_tracker_gcc_deps_spec.rb +199 -0
- data/spec/integration/dependencies/dependency_tracker_pruning_spec.rb +167 -0
- data/spec/integration/dependencies_plugin_spec.rb +473 -0
- data/spec/integration/erb_dependency_removed_spec.rb +167 -0
- data/spec/integration/includes_extraction_spec.rb +612 -0
- data/spec/integration/mixin_loading_spec.rb +414 -0
- data/spec/integration/module_generator_spec.rb +436 -0
- data/spec/integration/partials_fallback_preprocessing_spec.rb +316 -0
- data/spec/integration/partials_header_composition_spec.rb +889 -0
- data/spec/integration/partials_module_resolution_spec.rb +372 -0
- data/spec/integration/partials_symbol_linkage_spec.rb +371 -0
- data/spec/integration/preprocessing_transient_io_retry_spec.rb +135 -0
- data/spec/integration/quote_include_isolator_spec.rb +167 -0
- data/spec/integration/report_build_warnings_log_spec.rb +170 -0
- data/spec/integration/report_tests_log_factory_spec.rb +100 -0
- data/spec/integration/sanitizer_exclusions_spec.rb +126 -0
- data/spec/integration/system_harness_sanitizers_spec.rb +104 -0
- data/spec/integration/test_build_parallel_barrier_spec.rb +89 -0
- data/spec/integration/test_executable_manifest_spec.rb +118 -0
- data/spec/integration/test_includes_extractinator_spec.rb +293 -0
- data/spec/integration/tool_executor_spec.rb +224 -0
- data/spec/integration/tool_validator_spec.rb +133 -0
- data/spec/integration/vendor_copy_transient_io_retry_spec.rb +130 -0
- data/spec/manual/stress_test.rb +1 -1
- data/spec/support/config_yaml_helper.rb +17 -0
- data/spec/support/fixtures/sanitizer_reports/clang_asan_heap.txt +45 -0
- data/spec/support/fixtures/sanitizer_reports/clang_ubsan_shift.txt +5 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_heap.txt +47 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_leak.txt +10 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_segv.txt +6 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_ubsan_shift.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__all_pass.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_branches_only.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_functions_only.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_none.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__empty.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__gcov_context.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__mixed_all.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_matching.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_multiline.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_no_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_nonmatching.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_ignore_no_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_ignore_with_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__stdout_only.txt +6 -0
- data/spec/support/fixtures/templates/ide__all_pass.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_branches_only.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_functions_only.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_none.txt +10 -0
- data/spec/support/fixtures/templates/ide__empty.txt +8 -0
- data/spec/support/fixtures/templates/ide__gcov_context.txt +28 -0
- data/spec/support/fixtures/templates/ide__mixed_all.txt +29 -0
- data/spec/support/fixtures/templates/ide__one_failure_matching.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_failure_multiline.txt +17 -0
- data/spec/support/fixtures/templates/ide__one_failure_no_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_failure_nonmatching.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_ignore_no_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_ignore_with_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__stdout_only.txt +16 -0
- data/spec/support/fixtures/templates/pretty__all_pass.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_branches_only.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_functions_only.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_none.txt +8 -0
- data/spec/support/fixtures/templates/pretty__empty.txt +6 -0
- data/spec/support/fixtures/templates/pretty__gcov_context.txt +31 -0
- data/spec/support/fixtures/templates/pretty__mixed_all.txt +35 -0
- data/spec/support/fixtures/templates/pretty__one_failure_matching.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_failure_multiline.txt +17 -0
- data/spec/support/fixtures/templates/pretty__one_failure_no_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_failure_nonmatching.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_ignore_no_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_ignore_with_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__stdout_only.txt +15 -0
- data/spec/support/fixtures/valgrind_reports/sigsegv.log +51 -0
- data/spec/support/fixtures/valgrind_reports/sigsegv.xml +182 -0
- data/spec/support/include_guard_helper.rb +20 -0
- data/spec/support/integration/configurator_integration_helper.rb +159 -0
- data/spec/support/integration/dependency_tracker_integration_helper.rb +136 -0
- data/spec/support/integration/partials_generation_integration_helper.rb +726 -0
- data/spec/support/integration/spec_integration_helper.rb +285 -0
- data/spec/support/integration/test_includes_harness.rb +259 -0
- data/spec/support/integration/tool_executor_integration_helper.rb +55 -0
- data/spec/support/spec_helper.rb +41 -0
- data/spec/support/system/sanitizers/asan_ubsan.yml +82 -0
- data/spec/support/system/sanitizers/asan_ubsan_leaks.yml +57 -0
- data/spec/support/system/simplecov_boot.rb +66 -0
- data/spec/support/system/spec_system_helper.rb +376 -16
- data/spec/support/system/system_context.rb +181 -59
- data/spec/support/template_render_cases.rb +166 -0
- data/spec/system/bracket_path_handling_spec.rb +175 -0
- data/spec/system/build_output_mirroring_spec.rb +89 -0
- data/spec/system/build_recovery_spec.rb +382 -0
- data/spec/system/bullseye_deployment_spec.rb +102 -0
- data/spec/system/cli_surface_spec.rb +245 -0
- data/spec/system/command_hooks_spec.rb +117 -0
- data/spec/system/conditional_include_macro_visibility_spec.rb +32 -124
- data/spec/system/conditional_mock_includes_spec.rb +181 -0
- data/spec/system/cppcheck_deployment_spec.rb +26 -8
- data/spec/system/delta_builds_spec.rb +751 -0
- data/spec/system/deployment_as_gem_spec.rb +7 -0
- data/spec/system/deployment_as_vendor_spec.rb +29 -145
- data/spec/system/dumpconfig_spec.rb +137 -0
- data/spec/system/encoding_stress_spec.rb +7 -4
- data/spec/system/example_cipher_quest_spec.rb +25 -100
- data/spec/system/example_temp_sensor_spec.rb +30 -172
- data/spec/system/example_wondrous_forest_spec.rb +25 -62
- data/spec/system/extension_multiple_values_spec.rb +75 -0
- data/spec/system/files_paths_reporting_spec.rb +154 -0
- data/spec/system/gcov_deployment_spec.rb +72 -3
- data/spec/system/header_include_path_validation_spec.rb +222 -0
- data/spec/system/implicit_source_header_correspondence_disambiguation_spec.rb +100 -0
- data/spec/system/include_path_reconciliation_spec.rb +64 -0
- data/spec/system/mixin_ordering_spec.rb +30 -415
- data/spec/system/mocks_partials_configuration_validation_spec.rb +126 -0
- data/spec/system/parent_directory_reference_spec.rb +114 -0
- data/spec/system/partials_module_disambiguation_spec.rb +143 -0
- data/spec/system/pinned_thread_count_spec.rb +102 -0
- data/spec/system/plugin_delta_builds_spec.rb +179 -0
- data/spec/system/preprocessing_encoding_spec.rb +87 -4
- data/spec/system/preprocessing_fallback_conditionals_spec.rb +19 -25
- data/spec/system/preprocessing_parameterized_tests_spec.rb +2 -2
- data/spec/system/rake_release_task_path_disambiguation_spec.rb +97 -0
- data/spec/system/rake_test_task_path_disambiguation_spec.rb +118 -0
- data/spec/system/report_and_tooling_plugins_spec.rb +327 -0
- data/spec/system/ruby_replacement_spec.rb +1 -1
- data/spec/system/same_named_modules_spec.rb +115 -0
- data/spec/system/sanitize_deployment_spec.rb +64 -0
- data/spec/system/shuffle_tests_spec.rb +139 -0
- data/spec/system/sibling_header_collision_spec.rb +620 -0
- data/spec/system/subdir_include_preservation_spec.rb +63 -0
- data/spec/system/support/bullseye_common_test_cases.rb +369 -0
- data/spec/system/support/bullseye_helpers.rb +70 -0
- data/spec/system/support/common_test_cases.rb +167 -43
- data/spec/system/support/cppcheck_common_test_cases.rb +80 -0
- data/spec/system/support/cppcheck_helpers.rb +10 -8
- data/spec/system/support/gcov_common_test_cases.rb +173 -37
- data/spec/system/support/gcov_helpers.rb +3 -3
- data/spec/system/support/gcov_partials_test_cases.rb +48 -2
- data/spec/system/support/sanitize_common_test_cases.rb +222 -0
- data/spec/system/support/sanitize_helpers.rb +27 -0
- data/spec/system/support/valgrind_common_test_cases.rb +116 -16
- data/spec/system/support/valgrind_helpers.rb +3 -4
- data/spec/system/test_pipeline_stop_points_spec.rb +160 -0
- data/spec/system/test_runner_system_include_spec.rb +19 -41
- data/spec/system/test_source_file_directive_spec.rb +235 -0
- data/spec/system/upgrade_as_vendor_spec.rb +25 -46
- data/spec/system/valgrind_deployment_spec.rb +41 -0
- data/spec/units/batchinator_spec.rb +314 -0
- data/spec/units/bin/actionator_spec.rb +412 -0
- data/spec/units/bin/app_cfg_spec.rb +90 -0
- data/spec/units/bin/cli_handler_spec.rb +204 -0
- data/spec/units/bin/cli_helper_spec.rb +238 -10
- data/spec/units/bin/cli_options_transform_spec.rb +49 -0
- data/spec/units/bin/composinator_spec.rb +236 -0
- data/spec/units/bin/{projectinator_mixin_spec.rb → mixin_resolvinator_spec.rb} +122 -83
- data/spec/units/bin/mixin_standardizer_spec.rb +4 -3
- data/spec/units/bin/mixinator_spec.rb +58 -22
- data/spec/units/bin/path_validator_spec.rb +112 -0
- data/spec/units/bin/projectinator_spec.rb +223 -0
- data/spec/units/bin/rake_patches_spec.rb +52 -0
- data/spec/units/bin/recursive_merger_spec.rb +22 -0
- data/spec/units/bin/versionator_spec.rb +104 -0
- data/spec/units/c_extractor/c_extractor_code_text_spec.rb +4 -4
- data/spec/units/c_extractor/c_extractor_declarations_spec.rb +70 -0
- data/spec/units/c_extractor/c_extractor_functions_spec.rb +75 -1
- data/spec/units/c_extractor/c_extractor_preprocessing_spec.rb +158 -0
- data/spec/units/c_extractor/c_extractor_spec.rb +236 -6
- data/spec/units/ceedling/templateinator_golden_spec.rb +84 -0
- data/spec/units/ceedling/templateinator_spec.rb +188 -0
- data/spec/units/config/configurator_builder_spec.rb +444 -0
- data/spec/units/config/configurator_plugins_spec.rb +160 -0
- data/spec/units/config/configurator_setup_spec.rb +706 -6
- data/spec/units/config/configurator_spec.rb +952 -0
- data/spec/units/config/configurator_validator_spec.rb +259 -0
- data/spec/units/config/line_marker_suppressors_spec.rb +89 -0
- data/spec/units/config_matchinator_spec.rb +103 -0
- data/spec/units/defineinator_spec.rb +158 -0
- data/spec/units/dependencies/dependency_cache_store_spec.rb +364 -0
- data/spec/units/dependencies/dependency_debug_tree_spec.rb +189 -0
- data/spec/units/dependencies/dependency_differ_spec.rb +139 -0
- data/spec/units/dependencies/dependency_hasher_spec.rb +141 -0
- data/spec/units/dependencies/dependency_path_normalizer_spec.rb +111 -0
- data/spec/units/dependencies/dependency_tracker_spec.rb +905 -0
- data/spec/units/dependencies/dependinator_spec.rb +99 -0
- data/spec/units/dependencies/gcc_dependency_parser_spec.rb +152 -0
- data/spec/units/encodinator_spec.rb +92 -0
- data/spec/units/file_finder_helper_spec.rb +99 -15
- data/spec/units/file_finder_spec.rb +495 -0
- data/spec/units/file_path_collection_utils_spec.rb +9 -0
- data/spec/units/file_path_utils_spec.rb +736 -0
- data/spec/units/file_wrapper_spec.rb +447 -0
- data/spec/units/filename_extension_spec.rb +120 -0
- data/spec/units/flaginator_spec.rb +114 -0
- data/spec/units/generators/generator_helper_spec.rb +113 -0
- data/spec/units/generators/generator_mocks_spec.rb +131 -0
- data/spec/units/generators/generator_partials_spec.rb +336 -160
- data/spec/units/generators/generator_spec.rb +317 -0
- data/spec/units/generators/generator_test_results_backtrace_spec.rb +169 -9
- data/spec/units/generators/generator_test_results_sanity_checker_spec.rb +14 -6
- data/spec/units/generators/generator_test_results_spec.rb +65 -8
- data/spec/units/generators/generator_test_runner_spec.rb +1 -1
- data/spec/units/includes/include_factory_spec.rb +53 -0
- data/spec/units/includes/include_pathinator_spec.rb +269 -0
- data/spec/units/includes/include_spec.rb +8 -4
- data/spec/units/includes/includes_spec.rb +326 -18
- data/spec/units/mock_locator_spec.rb +74 -0
- data/spec/units/parsing_parcels_spec.rb +65 -0
- data/spec/units/partials/partializer_config_spec.rb +284 -18
- data/spec/units/partials/partializer_helper_spec.rb +122 -0
- data/spec/units/partials/partializer_spec.rb +346 -71
- data/spec/units/partials/partializer_utils_spec.rb +4 -4
- data/spec/units/partials_manager_spec.rb +539 -0
- data/spec/units/path_matcher_spec.rb +193 -0
- data/spec/units/path_mirror_spec.rb +103 -0
- data/spec/units/plugin_manager_spec.rb +77 -0
- data/spec/units/plugin_reportinator_spec.rb +78 -3
- data/spec/units/plugins/bullseye_spec.rb +1068 -0
- data/spec/units/plugins/command_hooks_spec.rb +157 -0
- data/spec/units/plugins/compile_commands_json_db_spec.rb +145 -0
- data/spec/units/plugins/console_reportinator_spec.rb +370 -0
- data/spec/units/plugins/cppcheck_spec.rb +330 -4
- data/spec/units/plugins/cppunit_tests_reporter_spec.rb +118 -0
- data/spec/units/plugins/dependencies_spec.rb +295 -0
- data/spec/units/plugins/dependency_commands_spec.rb +83 -0
- data/spec/units/plugins/dependency_environment_spec.rb +64 -0
- data/spec/units/plugins/dependency_spec_spec.rb +170 -0
- data/spec/units/plugins/gcov_reportinator_spec.rb +272 -0
- data/spec/units/plugins/gcov_spec.rb +521 -0
- data/spec/units/plugins/gcovr_reportinator_spec.rb +795 -0
- data/spec/units/plugins/gtestlike_report_spec.rb +363 -0
- data/spec/units/plugins/html_tests_reporter_spec.rb +158 -0
- data/spec/units/plugins/ide_report_lines_spec.rb +229 -0
- data/spec/units/plugins/json_tests_reporter_spec.rb +87 -0
- data/spec/units/plugins/junit_tests_reporter_spec.rb +237 -0
- data/spec/units/plugins/module_generator_options_spec.rb +185 -0
- data/spec/units/plugins/module_generator_project_spec.rb +55 -0
- data/spec/units/plugins/module_generator_request_spec.rb +107 -0
- data/spec/units/plugins/module_generator_spec.rb +214 -0
- data/spec/units/plugins/module_generator_test_file_spec.rb +102 -0
- data/spec/units/plugins/module_generator_unity_spec.rb +37 -0
- data/spec/units/plugins/report_build_warnings_log_spec.rb +199 -0
- data/spec/units/plugins/report_log_writer_plugin_spec.rb +94 -0
- data/spec/units/plugins/report_tests_gtestlike_stdout_spec.rb +274 -0
- data/spec/units/plugins/report_tests_ide_stdout_spec.rb +140 -0
- data/spec/units/plugins/report_tests_log_factory_spec.rb +210 -0
- data/spec/units/plugins/report_tests_pretty_stdout_spec.rb +83 -0
- data/spec/units/plugins/report_tests_raw_output_log_spec.rb +98 -0
- data/spec/units/plugins/report_tests_stdout_plugin_spec.rb +145 -0
- data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +121 -0
- data/spec/units/plugins/reportgenerator_reportinator_spec.rb +410 -0
- data/spec/units/plugins/sanitize_config_spec.rb +119 -0
- data/spec/units/plugins/sanitize_findings_spec.rb +69 -0
- data/spec/units/plugins/sanitize_records_spec.rb +114 -0
- data/spec/units/plugins/sanitize_reports_spec.rb +84 -0
- data/spec/units/plugins/sanitize_spec.rb +300 -0
- data/spec/units/plugins/tests_reporter_spec.rb +89 -0
- data/spec/units/plugins/valgrind_spec.rb +560 -0
- data/spec/units/plugins/warning_collector_spec.rb +185 -0
- data/spec/units/plugins/warning_reports_spec.rb +150 -0
- data/spec/units/preprocess/c_comment_scanner_spec.rb +17 -17
- data/spec/units/preprocess/c_preprocessor_conditionals_spec.rb +94 -0
- data/spec/units/preprocess/preprocessinator_bare_includes_extractor_spec.rb +73 -0
- data/spec/units/preprocess/preprocessinator_code_finder_spec.rb +35 -16
- data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +129 -48
- data/spec/units/preprocess/preprocessinator_file_assembler_spec.rb +292 -9
- data/spec/units/preprocess/preprocessinator_includes_handler_spec.rb +294 -16
- data/spec/units/preprocess/preprocessinator_line_marker_includes_extractor_spec.rb +356 -6
- data/spec/units/preprocess/preprocessinator_reconstructor_spec.rb +58 -4
- data/spec/units/preprocess/preprocessinator_spec.rb +693 -5
- data/spec/units/quote_include_isolator_spec.rb +176 -0
- data/spec/units/rake_app/rake_invocation_tracker_spec.rb +94 -0
- data/spec/units/rake_app/rake_task_registry_spec.rb +263 -0
- data/spec/units/rake_app/rake_utils_spec.rb +54 -0
- data/spec/units/rake_app/rake_wrapper_spec.rb +64 -0
- data/spec/units/rake_app/rakefile_component_resolver_spec.rb +182 -0
- data/spec/units/release_build_executor_spec.rb +404 -0
- data/spec/units/release_build_planner_spec.rb +144 -0
- data/spec/units/release_invoker_spec.rb +127 -0
- data/spec/units/reportinator_spec.rb +35 -0
- data/spec/units/ruby_expandinator_spec.rb +36 -0
- data/spec/units/standin_headerinator_spec.rb +168 -0
- data/spec/units/system_wrapper_spec.rb +16 -0
- data/spec/units/test_build_executor_spec.rb +1653 -8
- data/spec/units/test_build_planner_spec.rb +878 -0
- data/spec/units/test_build_setup_spec.rb +583 -0
- data/spec/units/test_context_extractor_spec.rb +51 -3
- data/spec/units/test_file_preprocessinator_spec.rb +206 -0
- data/spec/units/test_includes_extractinator_spec.rb +764 -0
- data/spec/units/test_invoker/objects_wiring_spec.rb +31 -0
- data/spec/units/test_invoker_spec.rb +147 -0
- data/spec/units/test_invoker_types_spec.rb +182 -0
- data/spec/units/test_pipeline_helpers_spec.rb +100 -0
- data/spec/units/test_pipeline_manager_spec.rb +415 -0
- data/spec/units/test_runner_generatinator_spec.rb +215 -0
- data/spec/units/test_runner_manager_spec.rb +70 -0
- data/spec/units/test_search_paths_spec.rb +84 -0
- data/spec/units/test_source_file_directive_resolver_spec.rb +239 -0
- data/spec/units/tool_executor_helper_spec.rb +1 -1
- data/spec/units/tool_executor_spec.rb +571 -2
- data/spec/units/tool_validator_spec.rb +303 -24
- data/spec/units/version_spec.rb +74 -0
- data/spec/units/yaml_wrapper_spec.rb +4 -1
- data/vendor/cmock/docs/CMock_Summary.md +11 -0
- data/vendor/cmock/lib/cmock_config.rb +1 -0
- data/vendor/cmock/lib/cmock_generator.rb +5 -1
- data/vendor/cmock/test/unit/cmock_generator_main_test.rb +31 -0
- data/vendor/cmock/vendor/unity/auto/generate_module.rb +4 -4
- data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +8 -2
- data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +2 -2
- data/vendor/cmock/vendor/unity/docs/UnityChangeLog.md +7 -0
- data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +4 -0
- data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
- data/vendor/cmock/vendor/unity/src/unity_internals.h +21 -7
- data/vendor/cmock/vendor/unity/test/Makefile +9 -2
- data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +1 -0
- data/vendor/cmock/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
- data/vendor/cmock/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
- data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
- data/vendor/cmock/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
- data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +78 -0
- data/vendor/cmock/vendor/unity/test/tests/test_unity_test_summary.rb +58 -0
- data/vendor/diy/lib/diy/factory.rb +5 -4
- data/vendor/diy/lib/diy.rb +5 -4
- data/vendor/diy/sample_code/car.rb +5 -4
- data/vendor/diy/sample_code/chassis.rb +5 -4
- data/vendor/diy/sample_code/diy_example.rb +5 -4
- data/vendor/diy/sample_code/engine.rb +5 -4
- data/vendor/diy/sample_code/objects.yml +5 -4
- data/vendor/diy/test/constructor.rb +5 -4
- data/vendor/diy/test/diy_test.rb +5 -4
- data/vendor/diy/test/factory_test.rb +5 -4
- data/vendor/diy/test/files/broken_construction.yml +5 -4
- data/vendor/diy/test/files/cat/cat.rb +5 -4
- data/vendor/diy/test/files/cat/extra_conflict.yml +5 -4
- data/vendor/diy/test/files/cat/heritage.rb +5 -4
- data/vendor/diy/test/files/cat/needs_input.yml +5 -4
- data/vendor/diy/test/files/cat/the_cat_lineage.rb +5 -4
- data/vendor/diy/test/files/dog/dog_model.rb +5 -4
- data/vendor/diy/test/files/dog/dog_presenter.rb +5 -4
- data/vendor/diy/test/files/dog/dog_view.rb +5 -4
- data/vendor/diy/test/files/dog/file_resolver.rb +5 -4
- data/vendor/diy/test/files/dog/other_thing.rb +5 -4
- data/vendor/diy/test/files/dog/simple.yml +5 -4
- data/vendor/diy/test/files/donkey/foo/bar/qux.rb +5 -4
- data/vendor/diy/test/files/donkey/foo.rb +5 -4
- data/vendor/diy/test/files/factory/beef.rb +5 -4
- data/vendor/diy/test/files/factory/dog.rb +5 -4
- data/vendor/diy/test/files/factory/factory.yml +5 -4
- data/vendor/diy/test/files/factory/farm/llama.rb +5 -4
- data/vendor/diy/test/files/factory/farm/pork.rb +5 -4
- data/vendor/diy/test/files/factory/kitten.rb +5 -4
- data/vendor/diy/test/files/fud/objects.yml +5 -4
- data/vendor/diy/test/files/fud/toy.rb +5 -4
- data/vendor/diy/test/files/functions/attached_things_builder.rb +5 -4
- data/vendor/diy/test/files/functions/invalid_method.yml +5 -4
- data/vendor/diy/test/files/functions/method_extractor.rb +5 -4
- data/vendor/diy/test/files/functions/nonsingleton_objects.yml +5 -4
- data/vendor/diy/test/files/functions/objects.yml +5 -4
- data/vendor/diy/test/files/functions/thing.rb +5 -4
- data/vendor/diy/test/files/functions/thing_builder.rb +5 -4
- data/vendor/diy/test/files/functions/things_builder.rb +5 -4
- data/vendor/diy/test/files/gnu/objects.yml +5 -4
- data/vendor/diy/test/files/gnu/thinger.rb +5 -4
- data/vendor/diy/test/files/goat/base.rb +5 -4
- data/vendor/diy/test/files/goat/can.rb +5 -4
- data/vendor/diy/test/files/goat/goat.rb +5 -4
- data/vendor/diy/test/files/goat/objects.yml +5 -4
- data/vendor/diy/test/files/goat/paper.rb +5 -4
- data/vendor/diy/test/files/goat/plane.rb +5 -4
- data/vendor/diy/test/files/goat/shirt.rb +5 -4
- data/vendor/diy/test/files/goat/wings.rb +5 -4
- data/vendor/diy/test/files/horse/holder_thing.rb +5 -4
- data/vendor/diy/test/files/horse/objects.yml +5 -4
- data/vendor/diy/test/files/namespace/animal/bird.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/cat.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/reptile/hardshell/turtle.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/reptile/lizard.rb +5 -4
- data/vendor/diy/test/files/namespace/bad_module_specified.yml +5 -4
- data/vendor/diy/test/files/namespace/class_name_combine.yml +5 -4
- data/vendor/diy/test/files/namespace/no_module_specified.yml +5 -4
- data/vendor/diy/test/files/namespace/objects.yml +5 -4
- data/vendor/diy/test/files/namespace/road.rb +5 -4
- data/vendor/diy/test/files/namespace/sky.rb +5 -4
- data/vendor/diy/test/files/namespace/subcontext.yml +5 -4
- data/vendor/diy/test/files/non_singleton/air.rb +5 -4
- data/vendor/diy/test/files/non_singleton/fat_cat.rb +5 -4
- data/vendor/diy/test/files/non_singleton/objects.yml +5 -4
- data/vendor/diy/test/files/non_singleton/pig.rb +5 -4
- data/vendor/diy/test/files/non_singleton/thread_spinner.rb +5 -4
- data/vendor/diy/test/files/non_singleton/tick.rb +5 -4
- data/vendor/diy/test/files/non_singleton/yard.rb +5 -4
- data/vendor/diy/test/files/yak/core_model.rb +5 -4
- data/vendor/diy/test/files/yak/core_presenter.rb +5 -4
- data/vendor/diy/test/files/yak/core_view.rb +5 -4
- data/vendor/diy/test/files/yak/data_source.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_model.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_presenter.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_view.rb +5 -4
- data/vendor/diy/test/files/yak/giant_squid.rb +5 -4
- data/vendor/diy/test/files/yak/krill.rb +5 -4
- data/vendor/diy/test/files/yak/my_objects.yml +5 -4
- data/vendor/diy/test/files/yak/sub_sub_context_test.yml +5 -4
- data/vendor/diy/test/test_helper.rb +5 -4
- data/vendor/unity/auto/generate_module.rb +4 -4
- data/vendor/unity/auto/generate_test_runner.rb +5 -1
- data/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
- data/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
- data/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
- data/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
- data/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
- data/vendor/unity/test/tests/test_generate_test_runner.rb +29 -0
- metadata +770 -287
- data/assets/tests_with_fallback_conditionals/src/conditional_module.c +0 -18
- data/bin/actions_wrapper.rb +0 -51
- data/docs/mkdocs/assets/images/ceedling-logo-circle.png +0 -0
- data/docs/mkdocs/assets/images/ceedling.svg +0 -90
- data/docs/mkdocs/assets/images/favicon.png +0 -0
- data/docs/mkdocs/assets/stylesheets/admonitions.css +0 -152
- data/docs/mkdocs/assets/stylesheets/fixes-local.css +0 -15
- data/docs/mkdocs/assets/stylesheets/styling.css +0 -102
- data/docs/mkdocs/configuration/environment-vars.md +0 -14
- data/docs/mkdocs/configuration/global-collections.md +0 -156
- data/docs/mkdocs/configuration/index.md +0 -75
- data/docs/mkdocs/configuration/loading.md +0 -89
- data/docs/mkdocs/configuration/mixins.md +0 -607
- data/docs/mkdocs/configuration/parallel-builds.md +0 -97
- data/docs/mkdocs/configuration/project-file.md +0 -216
- data/docs/mkdocs/configuration/reference/cexception.md +0 -35
- data/docs/mkdocs/configuration/reference/cmock.md +0 -106
- data/docs/mkdocs/configuration/reference/defines.md +0 -352
- data/docs/mkdocs/configuration/reference/environment.md +0 -55
- data/docs/mkdocs/configuration/reference/extension.md +0 -63
- data/docs/mkdocs/configuration/reference/files.md +0 -154
- data/docs/mkdocs/configuration/reference/flags.md +0 -296
- data/docs/mkdocs/configuration/reference/index.md +0 -176
- data/docs/mkdocs/configuration/reference/libraries.md +0 -82
- data/docs/mkdocs/configuration/reference/mixins.md +0 -24
- data/docs/mkdocs/configuration/reference/partials.md +0 -38
- data/docs/mkdocs/configuration/reference/paths.md +0 -276
- data/docs/mkdocs/configuration/reference/plugins.md +0 -60
- data/docs/mkdocs/configuration/reference/project.md +0 -333
- data/docs/mkdocs/configuration/reference/release-build.md +0 -62
- data/docs/mkdocs/configuration/reference/test-build.md +0 -55
- data/docs/mkdocs/configuration/reference/test-runner.md +0 -61
- data/docs/mkdocs/configuration/reference/tools.md +0 -457
- data/docs/mkdocs/configuration/reference/unity.md +0 -49
- data/docs/mkdocs/configuration/which-ceedling.md +0 -77
- data/docs/mkdocs/development/index.md +0 -61
- data/docs/mkdocs/development/plugins/configuration.md +0 -164
- data/docs/mkdocs/development/plugins/index.md +0 -84
- data/docs/mkdocs/development/plugins/plugin-subclass.md +0 -513
- data/docs/mkdocs/development/plugins/rake-tasks.md +0 -54
- data/docs/mkdocs/development/workflow.md +0 -284
- data/docs/mkdocs/getting-started/command-line.md +0 -477
- data/docs/mkdocs/getting-started/example-projects/cipher-quest.md +0 -65
- data/docs/mkdocs/getting-started/example-projects/index.md +0 -49
- data/docs/mkdocs/getting-started/example-projects/temp-sensor.md +0 -60
- data/docs/mkdocs/getting-started/example-projects/wondrous-forest.md +0 -45
- data/docs/mkdocs/getting-started/index.md +0 -41
- data/docs/mkdocs/getting-started/installation.md +0 -179
- data/docs/mkdocs/getting-started/quick-start.md +0 -86
- data/docs/mkdocs/help.md +0 -49
- data/docs/mkdocs/index.md +0 -222
- data/docs/mkdocs/overview/build-system.md +0 -115
- data/docs/mkdocs/overview/index.md +0 -29
- data/docs/mkdocs/overview/test-environments.md +0 -33
- data/docs/mkdocs/overview/tools-and-frameworks.md +0 -115
- data/docs/mkdocs/plugins/beep.md +0 -134
- data/docs/mkdocs/plugins/bullseye.md +0 -83
- data/docs/mkdocs/plugins/command-hooks.md +0 -268
- data/docs/mkdocs/plugins/compile-commands-json-db.md +0 -42
- data/docs/mkdocs/plugins/cppcheck.md +0 -377
- data/docs/mkdocs/plugins/dependencies.md +0 -310
- data/docs/mkdocs/plugins/fff.md +0 -247
- data/docs/mkdocs/plugins/gcov/examples.md +0 -92
- data/docs/mkdocs/plugins/gcov/gcovr.md +0 -526
- data/docs/mkdocs/plugins/gcov/index.md +0 -74
- data/docs/mkdocs/plugins/gcov/overview.md +0 -145
- data/docs/mkdocs/plugins/gcov/reportgenerator.md +0 -246
- data/docs/mkdocs/plugins/gcov/reporting.md +0 -147
- data/docs/mkdocs/plugins/gcov/setup.md +0 -232
- data/docs/mkdocs/plugins/gcov/tool-versions.md +0 -60
- data/docs/mkdocs/plugins/gcov/troubleshooting.md +0 -78
- data/docs/mkdocs/plugins/index.md +0 -261
- data/docs/mkdocs/plugins/module-generator.md +0 -267
- data/docs/mkdocs/plugins/report-build-warnings-log.md +0 -42
- data/docs/mkdocs/plugins/report-tests-gtestlike-stdout.md +0 -98
- data/docs/mkdocs/plugins/report-tests-ide-stdout.md +0 -63
- data/docs/mkdocs/plugins/report-tests-log-factory.md +0 -454
- data/docs/mkdocs/plugins/report-tests-pretty-stdout.md +0 -56
- data/docs/mkdocs/plugins/report-tests-raw-output-log.md +0 -52
- data/docs/mkdocs/plugins/report-tests-teamcity-stdout.md +0 -96
- data/docs/mkdocs/plugins/sample_html_report.png +0 -0
- data/docs/mkdocs/plugins/valgrind.md +0 -198
- data/docs/mkdocs/project/release-history.md +0 -61
- data/docs/mkdocs/project/upgrade.md +0 -85
- data/docs/mkdocs/reference/build-directives.md +0 -37
- data/docs/mkdocs/reference/command-line.md +0 -323
- data/docs/mkdocs/reference/environment-vars.md +0 -60
- data/docs/mkdocs/reference/gcov-plugin.md +0 -600
- data/docs/mkdocs/reference/global-collections.md +0 -160
- data/docs/mkdocs/reference/index.md +0 -65
- data/docs/mkdocs/reference/partials-macros.md +0 -79
- data/docs/mkdocs/reference/project-configuration.md +0 -46
- data/docs/mkdocs/snapshot/examples/cipher_quest/README.md +0 -210
- data/docs/mkdocs/snapshot/examples/temp_sensor/README.md +0 -283
- data/docs/mkdocs/snapshot/examples/wondrous_forest/README.md +0 -92
- data/docs/mkdocs/snapshot/plugins/gcov/config/defaults.yml +0 -32
- data/docs/mkdocs/snapshot/plugins/gcov/config/defaults_gcov.rb +0 -136
- data/docs/mkdocs/snapshot.yml +0 -20
- data/docs/mkdocs/testing-guide/build-directives.md +0 -153
- data/docs/mkdocs/testing-guide/conventions.md +0 -616
- data/docs/mkdocs/testing-guide/frameworks.md +0 -192
- data/docs/mkdocs/testing-guide/index.md +0 -80
- data/docs/mkdocs/testing-guide/partials/configuration.md +0 -67
- data/docs/mkdocs/testing-guide/partials/conventions.md +0 -68
- data/docs/mkdocs/testing-guide/partials/directives.md +0 -212
- data/docs/mkdocs/testing-guide/partials/example.md +0 -149
- data/docs/mkdocs/testing-guide/partials/index.md +0 -88
- data/docs/mkdocs/testing-guide/partials/overview.md +0 -81
- data/docs/mkdocs/testing-guide/partials/variables.md +0 -244
- data/docs/mkdocs/testing-guide/test-cases.md +0 -194
- data/docs/mkdocs/testing-guide/test-sample.md +0 -94
- data/docs/mkdocs/testing-guide/test-suite-anatomy.md +0 -58
- data/lib/ceedling/cacheinator.rb +0 -53
- data/lib/ceedling/cacheinator_helper.rb +0 -60
- data/lib/ceedling/dependinator.rb +0 -31
- data/lib/ceedling/makefile.rb +0 -52
- data/lib/ceedling/release_invoker.rb +0 -112
- data/lib/ceedling/rules_release.rake +0 -109
- data/lib/ceedling/rules_tests.rake +0 -40
- data/lib/ceedling/tasks_release.rake +0 -36
- data/plugins/fff/vendor/fff/Makefile +0 -10
- data/plugins/fff/vendor/fff/buildandtest +0 -15
- data/plugins/fff/vendor/fff/examples/Makefile +0 -7
- data/plugins/fff/vendor/fff/examples/driver_testing/Makefile +0 -64
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.c +0 -32
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.h +0 -21
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.cpp +0 -58
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.fff.cpp +0 -70
- data/plugins/fff/vendor/fff/examples/driver_testing/hardware_abstraction.h +0 -25
- data/plugins/fff/vendor/fff/examples/driver_testing/registers.h +0 -23
- data/plugins/fff/vendor/fff/examples/embedded_ui/DISPLAY.h +0 -27
- data/plugins/fff/vendor/fff/examples/embedded_ui/Kata.txt +0 -25
- data/plugins/fff/vendor/fff/examples/embedded_ui/Makefile +0 -67
- data/plugins/fff/vendor/fff/examples/embedded_ui/SYSTEM.h +0 -31
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI.c +0 -56
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI.h +0 -22
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_ansic.c +0 -191
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_cpp.cpp +0 -144
- data/plugins/fff/vendor/fff/examples/embedded_ui/test_suite_template.c +0 -42
- data/plugins/fff/vendor/fff/gtest/Makefile +0 -22
- data/plugins/fff/vendor/fff/gtest/gtest-all.cc +0 -9118
- data/plugins/fff/vendor/fff/gtest/gtest-main.cc +0 -6
- data/plugins/fff/vendor/fff/gtest/gtest.h +0 -19547
- data/plugins/fff/vendor/fff/test/Makefile +0 -81
- data/plugins/fff/vendor/fff/test/c_test_framework.h +0 -25
- data/plugins/fff/vendor/fff/test/fff_test_c.c +0 -116
- data/plugins/fff/vendor/fff/test/fff_test_cpp.cpp +0 -53
- data/plugins/fff/vendor/fff/test/fff_test_global_c.c +0 -84
- data/plugins/fff/vendor/fff/test/fff_test_global_cpp.cpp +0 -31
- data/plugins/fff/vendor/fff/test/global_fakes.c +0 -21
- data/plugins/fff/vendor/fff/test/global_fakes.h +0 -47
- data/plugins/fff/vendor/fff/test/test_cases.include +0 -276
- data/plugins/report_tests_gtestlike_stdout/assets/template.erb +0 -83
- data/site-local/snapshot/assets/project.yml +0 -404
- data/spec/system/partials_types_header_spec.rb +0 -166
- data/spec/units/configurator_spec.rb +0 -232
- /data/assets/{ceedling → features/ceedling} +0 -0
- /data/assets/{ceedling.cmd → features/ceedling.cmd} +0 -0
- /data/assets/{default_gitignore → features/default_gitignore} +0 -0
- /data/assets/{broken_uncovered_file.c → fixtures/broken_uncovered_file.c} +0 -0
- /data/assets/{example_file.c → fixtures/example_file.c} +0 -0
- /data/assets/{example_file.h → fixtures/example_file.h} +0 -0
- /data/assets/{example_file_call.c → fixtures/example_file_call.c} +0 -0
- /data/assets/{example_file_call.h → fixtures/example_file_call.h} +0 -0
- /data/assets/{example_file_with_statics.c → fixtures/example_file_with_statics.c} +0 -0
- /data/assets/{example_file_with_stdio.c → fixtures/example_file_with_stdio.c} +0 -0
- /data/assets/{example_file_with_stdio.h → fixtures/example_file_with_stdio.h} +0 -0
- /data/assets/{fake_crash_test_fixture.rb → fixtures/fake_crash_test_fixture.rb} +0 -0
- /data/assets/{partial_all_module.h → fixtures/partial_all_module.h} +0 -0
- /data/assets/{run_with_ubsan.rb → fixtures/run_with_ubsan.rb} +0 -0
- /data/assets/{same_dir_pairing_module.c → fixtures/same_dir_pairing_module.c} +0 -0
- /data/assets/{same_dir_pairing_module.h → fixtures/same_dir_pairing_module.h} +0 -0
- /data/assets/{same_dir_pairing_module_func.h → fixtures/same_dir_pairing_module_func.h} +0 -0
- /data/assets/{same_dir_pairing_other.c → fixtures/same_dir_pairing_other.c} +0 -0
- /data/assets/{same_dir_pairing_other.h → fixtures/same_dir_pairing_other.h} +0 -0
- /data/assets/{test_example_file.c → fixtures/test_example_file.c} +0 -0
- /data/assets/{test_example_file_2.c → fixtures/test_example_file_2.c} +0 -0
- /data/assets/{test_example_file_source_include.c → fixtures/test_example_file_source_include.c} +0 -0
- /data/assets/{test_example_file_success.c → fixtures/test_example_file_success.c} +0 -0
- /data/assets/{test_example_file_unity_printf.c → fixtures/test_example_file_unity_printf.c} +0 -0
- /data/assets/{test_example_file_verbose.c → fixtures/test_example_file_verbose.c} +0 -0
- /data/assets/{test_example_file_with_mock.c → fixtures/test_example_file_with_mock.c} +0 -0
- /data/assets/{test_example_file_with_stdio.c → fixtures/test_example_file_with_stdio.c} +0 -0
- /data/assets/{test_example_with_parameterized_tests.c → fixtures/test_example_with_parameterized_tests.c} +0 -0
- /data/assets/{test_partial_all_module.c → fixtures/test_partial_all_module.c} +0 -0
- /data/assets/{test_same_dir_pairing.c → fixtures/test_same_dir_pairing.c} +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_config.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/local_flag_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_wrapper.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/project_flag_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware_special.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.h +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder_partial.c +0 -0
- /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/conditional_module.h +0 -0
- /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/optional_dep.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_blanks.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_counter.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_decorators.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorA.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorB.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorC.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareA.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareB.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareC.c +0 -0
- /data/assets/{uncovered_example_file.c → fixtures/uncovered_example_file.c} +0 -0
- /data/plugins/bullseye/assets/{template.erb → coverage.template} +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
# Canonicalizes a path into the identity DependencyTracker uses as a cache key.
|
|
9
|
+
#
|
|
10
|
+
# Path *equality* is platform-dependent: Linux is case-sensitive (`Foo.c` and
|
|
11
|
+
# `foo.c` are different files); macOS (default APFS/HFS+) and Windows (NTFS)
|
|
12
|
+
# are case-insensitive but case-preserving (`Foo.c` and `foo.c` name the same
|
|
13
|
+
# file, but the filesystem remembers whichever casing created it). A target or
|
|
14
|
+
# dependency path can reach this code in whatever casing a caller happened to
|
|
15
|
+
# use (a `#include "Foo.h"` directive vs. an on-disk `foo.h`, or a path
|
|
16
|
+
# assembled from YAML config with inconsistent casing) -- if the cache key
|
|
17
|
+
# doesn't reflect the file's *actual* on-disk casing, a lookup can miss even
|
|
18
|
+
# though the file is genuinely the same one previously tracked.
|
|
19
|
+
#
|
|
20
|
+
# Rather than first detecting "is this filesystem case-insensitive?" as a
|
|
21
|
+
# separate yes/no probe, this class always attempts to recover the real
|
|
22
|
+
# on-disk casing for a path that exists, one directory component at a time,
|
|
23
|
+
# memoizing each directory's listing within this instance (a directory's
|
|
24
|
+
# contents don't change mid-build in the relevant sense, and this avoids
|
|
25
|
+
# re-listing the same directory for every path lookup that shares it). This
|
|
26
|
+
# is a no-op in the case-sensitive case: the exact-case entry is simply what
|
|
27
|
+
# the listing already contains, so resolution finds it immediately. A path
|
|
28
|
+
# that does not exist on disk (or a directory listing that fails, e.g. a
|
|
29
|
+
# permissions error) is returned expanded but otherwise unchanged -- it can't
|
|
30
|
+
# be case-resolved against a filesystem that can't be consulted, and callers
|
|
31
|
+
# already treat a nonexistent dependency as unconditionally stale.
|
|
32
|
+
class DependencyPathNormalizer
|
|
33
|
+
|
|
34
|
+
constructor :file_wrapper
|
|
35
|
+
|
|
36
|
+
def setup()
|
|
37
|
+
@directory_listing_cache = {}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Returns the canonical cache-key form of `path`: expanded to an absolute
|
|
41
|
+
# path and, if it exists, resolved to its real on-disk casing.
|
|
42
|
+
def normalize(path)
|
|
43
|
+
expanded = @file_wrapper.get_expanded_path( path )
|
|
44
|
+
return expanded unless @file_wrapper.exist?( expanded )
|
|
45
|
+
|
|
46
|
+
real_case_path( expanded )
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
### Private ###
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def real_case_path(path)
|
|
53
|
+
dir = @file_wrapper.dirname( path )
|
|
54
|
+
base = @file_wrapper.basename( path )
|
|
55
|
+
|
|
56
|
+
# Reached the filesystem root -- `dirname` of the root is itself.
|
|
57
|
+
return path if dir == path
|
|
58
|
+
|
|
59
|
+
parent = real_case_path( dir )
|
|
60
|
+
entries = directory_listing( parent )
|
|
61
|
+
|
|
62
|
+
# Prefer an exact-case match over a merely case-insensitive one: on a
|
|
63
|
+
# case-sensitive filesystem where two distinctly-cased entries genuinely
|
|
64
|
+
# coexist (e.g. `Foo.c` and `foo.c` as two different files), the exact
|
|
65
|
+
# match is unambiguously the right one -- falling back to a case-
|
|
66
|
+
# insensitive match is only correct when no exact match exists at all.
|
|
67
|
+
on_disk_entry = entries.find { |entry| entry == base } || entries.find { |entry| entry.casecmp?( base ) }
|
|
68
|
+
|
|
69
|
+
on_disk_entry ? File.join( parent, on_disk_entry ) : path
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def directory_listing(dir)
|
|
73
|
+
@directory_listing_cache[dir] ||= begin
|
|
74
|
+
@file_wrapper.directory_listing( File.join( dir, '*' ) ).map { |entry| @file_wrapper.basename( entry ) }
|
|
75
|
+
rescue StandardError
|
|
76
|
+
[]
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
require 'time'
|
|
9
|
+
require 'ceedling/constants'
|
|
10
|
+
require 'ceedling/exceptions'
|
|
11
|
+
|
|
12
|
+
# A pure query module for content-hash-based rebuild staleness -- not a build
|
|
13
|
+
# scheduler. Ceedling's existing Rake-based, multithreaded, conditionally-
|
|
14
|
+
# branching build steps already encode ordering via task prerequisites; this
|
|
15
|
+
# class only answers, at the moment an existing build step considers whether
|
|
16
|
+
# to run, "has anything this target depends on changed since it last built
|
|
17
|
+
# successfully?" Cascading rebuilds fall out of Ceedling's existing task
|
|
18
|
+
# graph, not from anything in here.
|
|
19
|
+
#
|
|
20
|
+
# Usage, once per target within a single Ceedling invocation:
|
|
21
|
+
# tracker.register(target, files: [...], meta: {...}) # may be called more than once; additive
|
|
22
|
+
# if tracker.stale?(target)
|
|
23
|
+
# ... run the real build step ...
|
|
24
|
+
# tracker.register(target, outputs: [...]) # optional; files the step produced
|
|
25
|
+
# tracker.mark_fresh(target)
|
|
26
|
+
# end
|
|
27
|
+
# tracker.flush # once, after all targets for this invocation are processed
|
|
28
|
+
#
|
|
29
|
+
# `meta` is an arbitrary, caller-supplied Hash folded into one canonicalized,
|
|
30
|
+
# hashed blob alongside the file-content hashes -- compilation/link flags,
|
|
31
|
+
# `-D` defines, include/search paths, toolchain version strings, and status
|
|
32
|
+
# booleans (coverage on/off, MC/DC on/off, release vs. debug, ...). A target
|
|
33
|
+
# is stale if any of: it was never registered, it doesn't exist on disk, its
|
|
34
|
+
# own content hash changed, its meta hash changed, any dependency's content
|
|
35
|
+
# hash changed, or any dependency no longer exists.
|
|
36
|
+
#
|
|
37
|
+
# `outputs` are files a step produces beside its target and later trusts, such as
|
|
38
|
+
# cached results. A fresh target vouches for the outputs recorded with it, so a
|
|
39
|
+
# recorded output that is missing or altered makes the target stale too. Only a
|
|
40
|
+
# regular file counts as present, for a target, a dependency or an output alike.
|
|
41
|
+
#
|
|
42
|
+
# Every filesystem touch goes through the injected FileWrapper (and ENV access
|
|
43
|
+
# through SystemWrapper), so every code path here is exercisable in specs
|
|
44
|
+
# without creating a single real file.
|
|
45
|
+
class DependencyTracker
|
|
46
|
+
|
|
47
|
+
DEBUG_TIERS = { none: 0, meta: 1, full: 2 }.freeze unless const_defined?(:DEBUG_TIERS, false)
|
|
48
|
+
|
|
49
|
+
# Tier 2 (:full) captures raw dependency file content per target, per build --
|
|
50
|
+
# a single huge generated header could otherwise blow up the cache file
|
|
51
|
+
# silently. Content beyond this size is recorded as truncated (with its real
|
|
52
|
+
# size) rather than either silently dropped or silently included in full.
|
|
53
|
+
DEBUG_FULL_CAPTURE_SIZE_CAP = 1_048_576 unless const_defined?(:DEBUG_FULL_CAPTURE_SIZE_CAP, false) # 1 MiB
|
|
54
|
+
|
|
55
|
+
constructor(
|
|
56
|
+
:file_wrapper,
|
|
57
|
+
:system_wrapper,
|
|
58
|
+
:loginator,
|
|
59
|
+
:dependency_hasher,
|
|
60
|
+
:dependency_path_normalizer,
|
|
61
|
+
:dependency_cache_store,
|
|
62
|
+
:gcc_dependency_parser,
|
|
63
|
+
:dependency_debug_tree,
|
|
64
|
+
:dependency_differ
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def setup()
|
|
68
|
+
@mutex = Mutex.new
|
|
69
|
+
@store_path = nil
|
|
70
|
+
@debug_root = nil
|
|
71
|
+
@debug_tier = DEBUG_TIERS[:none]
|
|
72
|
+
@relationships = {}
|
|
73
|
+
@cache = { 'entries' => {} }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Must be called once before any other method. Loads (and validates) any
|
|
77
|
+
# existing cache at `store_path`. `debug_tier` (:none, :meta, or :full)
|
|
78
|
+
# defaults to the `CEEDLING_DEP_DEBUG` environment variable when not given
|
|
79
|
+
# explicitly, matching Ceedling's existing convention of environment
|
|
80
|
+
# variables acting as an override for otherwise-code-driven settings (see
|
|
81
|
+
# Loginator's `CEEDLING_DECORATORS` handling) -- and falls back to :none for
|
|
82
|
+
# anything unset or unrecognized, since these tiers are meant to be opt-in,
|
|
83
|
+
# temporary debugging aids, never a silently-active default.
|
|
84
|
+
#
|
|
85
|
+
# Any cache entries dropped while loading (malformed, or their target
|
|
86
|
+
# deleted from disk -- see DependencyCacheStore#load) have their
|
|
87
|
+
# DependencyDebugTree data pruned too, so the debug tree never outlives
|
|
88
|
+
# the cache entries it exists to explain.
|
|
89
|
+
def open(store_path:, debug_tier: nil)
|
|
90
|
+
@store_path = store_path
|
|
91
|
+
@debug_root = debug_root_for( store_path )
|
|
92
|
+
@debug_tier = resolve_debug_tier( debug_tier )
|
|
93
|
+
|
|
94
|
+
@mutex.synchronize do
|
|
95
|
+
@relationships = {}
|
|
96
|
+
@cache = @dependency_cache_store.load( @store_path )
|
|
97
|
+
( @cache['pruned'] || [] ).each { |target| @dependency_debug_tree.prune( @debug_root, target ) }
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Registers `target`'s dependency files and/or meta. Additive: calling this
|
|
102
|
+
# more than once for the same target unions the file lists (deduplicated)
|
|
103
|
+
# and shallow-merges the meta hashes (later calls win on conflicting keys)
|
|
104
|
+
# rather than replacing the prior registration -- so a target's
|
|
105
|
+
# dependencies can be accumulated incrementally across multiple calls (e.g.
|
|
106
|
+
# one call for its own source file plus explicit config, another from
|
|
107
|
+
# `register_gcc_deps_file`/`register_gcc_deps_string` for its discovered
|
|
108
|
+
# header dependencies) without each caller needing to know and resupply
|
|
109
|
+
# everything a previous caller already established.
|
|
110
|
+
#
|
|
111
|
+
# `outputs` accumulate the same way. A step registers them once it has produced
|
|
112
|
+
# them, before `mark_fresh` records their hashes.
|
|
113
|
+
def register(target, files: [], meta: {}, outputs: [])
|
|
114
|
+
ensure_open!
|
|
115
|
+
|
|
116
|
+
key = @dependency_path_normalizer.normalize( target )
|
|
117
|
+
file_keys = Array( files ).map { |file| @dependency_path_normalizer.normalize( file ) }
|
|
118
|
+
output_keys = Array( outputs ).map { |output| @dependency_path_normalizer.normalize( output ) }
|
|
119
|
+
|
|
120
|
+
@mutex.synchronize do
|
|
121
|
+
existing = @relationships[key] || empty_relationship()
|
|
122
|
+
@relationships[key] = {
|
|
123
|
+
files: (existing[:files] + file_keys).uniq,
|
|
124
|
+
meta: existing[:meta].merge( meta ),
|
|
125
|
+
outputs: (existing[:outputs] + output_keys).uniq
|
|
126
|
+
}
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Parses gcc `-M`/`-MM`/`-MMD` Makefile-dialect dependency content and
|
|
131
|
+
# additively registers each target it discovers (see `register`) with its
|
|
132
|
+
# parsed dependencies. `meta` is applied identically to every target found
|
|
133
|
+
# in `content`.
|
|
134
|
+
def register_gcc_deps_string(content, meta: {})
|
|
135
|
+
ensure_open!
|
|
136
|
+
|
|
137
|
+
@gcc_dependency_parser.parse( content ).each do |target, deps|
|
|
138
|
+
register( target, files: deps, meta: meta )
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# As `register_gcc_deps_string`, but reads `filepath` (e.g. a `.d` file
|
|
143
|
+
# produced by gcc's `-MF`) via the injected FileWrapper first.
|
|
144
|
+
def register_gcc_deps_file(filepath, meta: {})
|
|
145
|
+
ensure_open!
|
|
146
|
+
register_gcc_deps_string( @file_wrapper.read( filepath ), meta: meta )
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Pure query -- never mutates the cache. `target` is stale if:
|
|
150
|
+
# - it was never registered this run,
|
|
151
|
+
# - it does not exist on disk as a regular file,
|
|
152
|
+
# - there is no prior cache entry for it,
|
|
153
|
+
# - its own content hash no longer matches the cache entry,
|
|
154
|
+
# - its meta hash no longer matches the cache entry,
|
|
155
|
+
# - any registered dependency no longer exists, or its content hash no
|
|
156
|
+
# longer matches the cache entry, or
|
|
157
|
+
# - any output recorded in the cache entry no longer exists, or its content
|
|
158
|
+
# hash no longer matches.
|
|
159
|
+
#
|
|
160
|
+
# Outputs come from the cache entry rather than this run's registrations, so a
|
|
161
|
+
# step need not know its outputs before asking.
|
|
162
|
+
def stale?(target)
|
|
163
|
+
ensure_open!
|
|
164
|
+
|
|
165
|
+
key = @dependency_path_normalizer.normalize( target )
|
|
166
|
+
rel = @mutex.synchronize { @relationships[key] }
|
|
167
|
+
return true if rel.nil?
|
|
168
|
+
return true unless regular_file?( key )
|
|
169
|
+
|
|
170
|
+
entry = @mutex.synchronize { @cache['entries'][key] }
|
|
171
|
+
return true if entry.nil?
|
|
172
|
+
return true if entry['self_hash'] != @dependency_hasher.hash_of_file( key )
|
|
173
|
+
return true if entry['meta_hash'] != @dependency_hasher.hash_of_meta( rel[:meta] )
|
|
174
|
+
return true unless rel[:files].all? { |dep| matches?( dep, entry.dig( 'deps', dep ) ) }
|
|
175
|
+
|
|
176
|
+
!( entry['outputs'] || {} ).all? { |output, digest| matches?( output, digest ) }
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Records `target` (and its currently-registered dependencies, meta, and outputs)
|
|
180
|
+
# as fresh -- called by a build step after it successfully (re)builds `target`.
|
|
181
|
+
# A dependency or output that isn't currently a regular file is simply omitted
|
|
182
|
+
# from the recorded hashes (rather than raising); the next `stale?` call already
|
|
183
|
+
# treats a missing dependency as stale on its own.
|
|
184
|
+
#
|
|
185
|
+
# When a debug tier is active, this also writes a DependencyDebugTree
|
|
186
|
+
# snapshot for `target` (tier :meta+: canonicalized meta; tier :full:
|
|
187
|
+
# target content too) and, at tier :full, for every currently-registered
|
|
188
|
+
# dependency (content only -- a dependency has no meta of its own). These
|
|
189
|
+
# snapshots are what `diagnose` later diffs live content against; nothing
|
|
190
|
+
# is embedded in the JSON cache entry itself.
|
|
191
|
+
def mark_fresh(target)
|
|
192
|
+
ensure_open!
|
|
193
|
+
|
|
194
|
+
key = @dependency_path_normalizer.normalize( target )
|
|
195
|
+
rel = @mutex.synchronize { @relationships[key] } || empty_relationship()
|
|
196
|
+
|
|
197
|
+
# A target isn't guaranteed to exist -- e.g. a caller conditionally writes one of two
|
|
198
|
+
# mutually exclusive outcome files -- so this mirrors `stale?`'s own presence check
|
|
199
|
+
# before ever hashing the target. `hashes_of` extends the same tolerance to each
|
|
200
|
+
# dependency and output.
|
|
201
|
+
self_hash = regular_file?( key ) ? @dependency_hasher.hash_of_file( key ) : nil
|
|
202
|
+
entry = {
|
|
203
|
+
'self_hash' => self_hash,
|
|
204
|
+
'meta_hash' => @dependency_hasher.hash_of_meta( rel[:meta] ),
|
|
205
|
+
'deps' => hashes_of( rel[:files] )
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
# Only a target with outputs carries the key, so every other entry is unchanged
|
|
209
|
+
outputs = hashes_of( rel[:outputs] )
|
|
210
|
+
entry['outputs'] = outputs unless outputs.empty?
|
|
211
|
+
|
|
212
|
+
capture_debug_snapshots( key, self_hash, rel ) if @debug_tier > DEBUG_TIERS[:none]
|
|
213
|
+
|
|
214
|
+
@mutex.synchronize { @cache['entries'][key] = entry }
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# Explicit cache-busting: drops any cache entry for `target`, so the next
|
|
218
|
+
# `stale?` call for it returns true regardless of hashes. Does not affect
|
|
219
|
+
# this run's `register`ed relationships for `target`.
|
|
220
|
+
def invalidate(target)
|
|
221
|
+
ensure_open!
|
|
222
|
+
key = @dependency_path_normalizer.normalize( target )
|
|
223
|
+
@mutex.synchronize { @cache['entries'].delete( key ) }
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# Persists the current cache state to `store_path`. Intended to be called
|
|
227
|
+
# once per Ceedling invocation, after all targets have been processed.
|
|
228
|
+
#
|
|
229
|
+
# `prune: true` additionally drops any cache entry whose target was *not*
|
|
230
|
+
# `register`ed at some point during this run, both from what gets
|
|
231
|
+
# persisted and from in-memory state. This is opt-in and off by default
|
|
232
|
+
# because it is only correct when the caller knows this run's
|
|
233
|
+
# registrations represent the complete, current set of targets -- e.g. a
|
|
234
|
+
# real `test:all`/`release` run, never a partial build of a single file
|
|
235
|
+
# (`ceedling test:some_file.c`), which would otherwise wipe cache entries
|
|
236
|
+
# for every target the partial build simply didn't touch. Contrast with
|
|
237
|
+
# the always-on, always-safe pruning `DependencyCacheStore#load` already
|
|
238
|
+
# does for targets provably deleted from disk, which cannot misfire this
|
|
239
|
+
# way regardless of build completeness.
|
|
240
|
+
def flush(prune: false)
|
|
241
|
+
ensure_open!
|
|
242
|
+
|
|
243
|
+
entries = @mutex.synchronize do
|
|
244
|
+
if prune
|
|
245
|
+
dropped = @cache['entries'].keys.reject { |target| @relationships.key?( target ) }
|
|
246
|
+
@cache['entries'].select! { |target, _entry| @relationships.key?( target ) }
|
|
247
|
+
dropped.each { |target| @dependency_debug_tree.prune( @debug_root, target ) }
|
|
248
|
+
end
|
|
249
|
+
@cache['entries'].dup
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
@dependency_cache_store.persist( @store_path, entries )
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# Explains why `target` is (or was last found to be) stale: which of
|
|
256
|
+
# self/meta/dependencies changed, and -- to whatever extent a prior
|
|
257
|
+
# DependencyDebugTree snapshot is available to compare against (see
|
|
258
|
+
# `mark_fresh`) -- an actual diff for each. Always runs (no debug tier
|
|
259
|
+
# required): with no snapshots ever captured, it still reports *which*
|
|
260
|
+
# checks failed, just without diff detail, each annotated with why no
|
|
261
|
+
# diff could be produced. Writes the result to the debug tree as
|
|
262
|
+
# `diagnosis.yml` under `target`'s own mirrored directory, and also
|
|
263
|
+
# returns it directly for programmatic use (e.g. specs).
|
|
264
|
+
#
|
|
265
|
+
# Does not require `target` to currently be stale -- calling it on a
|
|
266
|
+
# fresh target just reports everything as unchanged.
|
|
267
|
+
def diagnose(target)
|
|
268
|
+
ensure_open!
|
|
269
|
+
|
|
270
|
+
key = @dependency_path_normalizer.normalize( target )
|
|
271
|
+
rel = @mutex.synchronize { @relationships[key] }
|
|
272
|
+
entry = @mutex.synchronize { @cache['entries'][key] }
|
|
273
|
+
|
|
274
|
+
diagnosis = { 'target' => key, 'diagnosed_at' => Time.now.utc.iso8601 }
|
|
275
|
+
|
|
276
|
+
if rel.nil?
|
|
277
|
+
diagnosis['reason'] = 'never registered this run'
|
|
278
|
+
elsif !regular_file?( key )
|
|
279
|
+
diagnosis['reason'] = 'target does not exist on disk'
|
|
280
|
+
elsif entry.nil?
|
|
281
|
+
diagnosis['reason'] = 'no prior cache entry (never marked fresh)'
|
|
282
|
+
else
|
|
283
|
+
diagnosis['self'] = diagnose_self( key, entry )
|
|
284
|
+
diagnosis['meta'] = diagnose_meta( key, rel, entry )
|
|
285
|
+
diagnosis['antecedents'] = rel[:files].map { |dep| diagnose_dependency( dep, entry ) }
|
|
286
|
+
diagnosis['outputs'] = ( entry['outputs'] || {} ).map { |output, digest| diagnose_output( output, digest ) }
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
@dependency_debug_tree.write_diagnosis( @debug_root, key, diagnosis )
|
|
290
|
+
diagnosis
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
### Private ###
|
|
294
|
+
private
|
|
295
|
+
|
|
296
|
+
def ensure_open!
|
|
297
|
+
return unless @store_path.nil?
|
|
298
|
+
raise CeedlingException.new( 'DependencyTracker#open must be called before use.' )
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def resolve_debug_tier(explicit)
|
|
302
|
+
tier = explicit || env_debug_tier()
|
|
303
|
+
DEBUG_TIERS.fetch( tier, DEBUG_TIERS[:none] )
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def env_debug_tier
|
|
307
|
+
value = @system_wrapper.env_get( 'CEEDLING_DEP_DEBUG' )
|
|
308
|
+
return :none if value.nil? || value.strip.empty?
|
|
309
|
+
value.strip.downcase.to_sym
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# Debug tree root, derived from `store_path` rather than a separate
|
|
313
|
+
# parameter -- `.dep_cache.json` -> `.dep_cache_debug/`, alongside it.
|
|
314
|
+
def debug_root_for(store_path)
|
|
315
|
+
dir = @file_wrapper.dirname( store_path )
|
|
316
|
+
base = @file_wrapper.basename( store_path, @file_wrapper.extname( store_path ) )
|
|
317
|
+
File.join( dir, "#{base}_debug" )
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def capture_debug_snapshots(key, self_hash, rel)
|
|
321
|
+
meta = @debug_tier >= DEBUG_TIERS[:meta] ? @dependency_hasher.canonicalize( rel[:meta] ) : nil
|
|
322
|
+
content = @debug_tier >= DEBUG_TIERS[:full] ? captured_content( key ) : {}
|
|
323
|
+
|
|
324
|
+
@dependency_debug_tree.write_snapshot( @debug_root, key, hash: self_hash, meta: meta, **content )
|
|
325
|
+
|
|
326
|
+
return unless @debug_tier >= DEBUG_TIERS[:full]
|
|
327
|
+
|
|
328
|
+
rel[:files].each do |dep|
|
|
329
|
+
next unless regular_file?( dep )
|
|
330
|
+
@dependency_debug_tree.write_snapshot( @debug_root, dep, hash: @dependency_hasher.hash_of_file( dep ), **captured_content( dep ) )
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def captured_content(path)
|
|
335
|
+
content = @file_wrapper.read( path )
|
|
336
|
+
if content.bytesize > DEBUG_FULL_CAPTURE_SIZE_CAP
|
|
337
|
+
{ truncated: true, size: content.bytesize }
|
|
338
|
+
else
|
|
339
|
+
{ content: content }
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def diagnose_self(key, entry)
|
|
344
|
+
current_hash = @dependency_hasher.hash_of_file( key )
|
|
345
|
+
changed = entry['self_hash'] != current_hash
|
|
346
|
+
result = { 'changed' => changed }
|
|
347
|
+
return result unless changed
|
|
348
|
+
|
|
349
|
+
snapshot = @dependency_debug_tree.read_snapshot( @debug_root, key )
|
|
350
|
+
current_content = regular_file?( key ) ? @file_wrapper.read( key ) : nil
|
|
351
|
+
result.merge( @dependency_differ.diff_content( snapshot, current_content ) )
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
def diagnose_meta(key, rel, entry)
|
|
355
|
+
current_meta_hash = @dependency_hasher.hash_of_meta( rel[:meta] )
|
|
356
|
+
changed = entry['meta_hash'] != current_meta_hash
|
|
357
|
+
result = { 'changed' => changed }
|
|
358
|
+
return result unless changed
|
|
359
|
+
|
|
360
|
+
snapshot = @dependency_debug_tree.read_snapshot( @debug_root, key )
|
|
361
|
+
old_meta = snapshot && snapshot['meta']
|
|
362
|
+
new_meta = @dependency_hasher.canonicalize( rel[:meta] )
|
|
363
|
+
result.merge( @dependency_differ.diff_meta( old_meta, new_meta ) )
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def diagnose_dependency(dep, entry)
|
|
367
|
+
return { 'path' => dep, 'missing' => true } unless regular_file?( dep )
|
|
368
|
+
|
|
369
|
+
current_hash = @dependency_hasher.hash_of_file( dep )
|
|
370
|
+
changed = entry.dig( 'deps', dep ) != current_hash
|
|
371
|
+
result = { 'path' => dep, 'changed' => changed }
|
|
372
|
+
return result unless changed
|
|
373
|
+
|
|
374
|
+
snapshot = @dependency_debug_tree.read_snapshot( @debug_root, dep )
|
|
375
|
+
result.merge( @dependency_differ.diff_content( snapshot, @file_wrapper.read( dep ) ) )
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
# Outputs keep no debug snapshot, so a diagnosis reports only that one changed
|
|
379
|
+
def diagnose_output(output, digest)
|
|
380
|
+
return { 'path' => output, 'missing' => true } unless regular_file?( output )
|
|
381
|
+
|
|
382
|
+
{ 'path' => output, 'changed' => digest != @dependency_hasher.hash_of_file( output ) }
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
def empty_relationship()
|
|
386
|
+
{ files: [], meta: {}, outputs: [] }
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
# A directory is never a dependency or output, however a `.d` file came to name one
|
|
390
|
+
def regular_file?(path)
|
|
391
|
+
@file_wrapper.exist?( path ) && !@file_wrapper.directory?( path )
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
# Whether `path` is still a regular file with the content hashed as `digest`
|
|
395
|
+
def matches?(path, digest)
|
|
396
|
+
regular_file?( path ) && digest == @dependency_hasher.hash_of_file( path )
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
def hashes_of(paths)
|
|
400
|
+
paths.each_with_object( {} ) do |path, hashes|
|
|
401
|
+
hashes[path] = @dependency_hasher.hash_of_file( path ) if regular_file?( path )
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
# Ceedling-specific adapter between the build pipeline and the generic,
|
|
9
|
+
# application-agnostic DependencyTracker -- owns the tracker's lifecycle
|
|
10
|
+
# (where its cache file lives, when it's opened and flushed) so pipeline
|
|
11
|
+
# code only ever deals in build verbs, never cache mechanics.
|
|
12
|
+
class Dependinator
|
|
13
|
+
|
|
14
|
+
CACHE_FILENAME = 'dep_cache.json'.freeze unless const_defined?(:CACHE_FILENAME, false)
|
|
15
|
+
|
|
16
|
+
constructor :dependency_tracker
|
|
17
|
+
|
|
18
|
+
# Builds the cache file path for a given pipeline identifier (:test, :release, a
|
|
19
|
+
# plugin's own symbol, ...). Public and callable without an instance so any
|
|
20
|
+
# caller -- a pipeline invoker, a spec, a future plugin -- can compute or inspect
|
|
21
|
+
# the path an identifier resolves to. Every identifier lands in the same,
|
|
22
|
+
# already-unconditionally-created directory, distinguished by filename alone, so
|
|
23
|
+
# a new pipeline needs no build-path scaffolding of its own to get an isolated
|
|
24
|
+
# cache -- just a unique identifier.
|
|
25
|
+
def self.cache_store_path(identifier)
|
|
26
|
+
File.join( PROJECT_BUILD_DEPENDENCIES_CACHE_PATH, ".#{identifier}.#{CACHE_FILENAME}" )
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# `identifier` isolates one pipeline's cache from another's -- sharing a single
|
|
30
|
+
# cache file between, say, test and release builds would make a full test:all
|
|
31
|
+
# run's pruning flush (see `flush`) silently evict every cached release entry,
|
|
32
|
+
# and vice versa, since pruning drops anything not registered in the current run.
|
|
33
|
+
def open(identifier: :test)
|
|
34
|
+
@dependency_tracker.open( store_path: self.class.cache_store_path( identifier ) )
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def register(target, files: [], meta: {}, outputs: [])
|
|
38
|
+
@dependency_tracker.register( target, files: files, meta: meta, outputs: outputs )
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def register_gcc_deps_file(filepath, meta: {})
|
|
42
|
+
@dependency_tracker.register_gcc_deps_file( filepath, meta: meta )
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def stale?(target)
|
|
46
|
+
@dependency_tracker.stale?( target )
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def mark_fresh(target)
|
|
50
|
+
@dependency_tracker.mark_fresh( target )
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def invalidate(target)
|
|
54
|
+
@dependency_tracker.invalidate( target )
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# `refresh_dependencies` is a full-run signal, set only by `test:all` (tasks_tests.rake):
|
|
58
|
+
# only a run that touched every test target may safely prune cache entries
|
|
59
|
+
# for targets it didn't see this time -- a partial build (a single test
|
|
60
|
+
# file, `test:pattern`, `test:path`, `test:build_only`) must not.
|
|
61
|
+
def flush(refresh_dependencies: false)
|
|
62
|
+
@dependency_tracker.flush( prune: refresh_dependencies )
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
# Parses gcc's `-M`/`-MM`/`-MMD` Makefile-dialect dependency output into a plain
|
|
9
|
+
# `{ target => [dep, dep, ...] }` mapping. Pure string processing -- no filesystem
|
|
10
|
+
# access, so it works identically whether the content came from a real `.d` file
|
|
11
|
+
# or an in-memory string handed to it directly (e.g. from a test, or a caller
|
|
12
|
+
# that already has the content in hand).
|
|
13
|
+
#
|
|
14
|
+
# Handles:
|
|
15
|
+
# - Backslash-newline line continuations (`\` at end of line joins with the next).
|
|
16
|
+
# - Multiple targets in one blob, including `-MP` phony no-prerequisite targets
|
|
17
|
+
# (`some_header.h:` with nothing after the colon).
|
|
18
|
+
# - Multiple targets sharing one prerequisite list on a single logical line
|
|
19
|
+
# (`a.o b.o: common.h`), valid Make syntax though gcc rarely emits it directly.
|
|
20
|
+
# - Escaped spaces in paths (`\ ` -> literal space), as gcc emits for paths
|
|
21
|
+
# containing spaces.
|
|
22
|
+
# - Windows drive-letter paths (`C:\foo\bar.h`): the drive-letter colon is not
|
|
23
|
+
# mistaken for the target/prerequisite separator because a real separator
|
|
24
|
+
# colon must be followed by whitespace or end-of-line, while a drive-letter
|
|
25
|
+
# colon is immediately followed by `\` or `/`.
|
|
26
|
+
class GccDependencyParser
|
|
27
|
+
|
|
28
|
+
# A logical line's target/prerequisite separator: a colon immediately
|
|
29
|
+
# followed by whitespace or end-of-line. A colon immediately followed by
|
|
30
|
+
# `\` or `/` (a Windows drive letter) does not match and is skipped over.
|
|
31
|
+
SEPARATOR_RE = /\A(.*?):(?=[ \t]|\z)[ \t]*(.*)\z/ unless const_defined?(:SEPARATOR_RE, false)
|
|
32
|
+
|
|
33
|
+
# A token is a maximal run of "escaped character" or "non-whitespace"
|
|
34
|
+
# sequences -- this keeps an escaped space (`\ `) glued to its token instead
|
|
35
|
+
# of splitting on it as a token boundary.
|
|
36
|
+
TOKEN_RE = /(?:\\.|\S)+/ unless const_defined?(:TOKEN_RE, false)
|
|
37
|
+
|
|
38
|
+
# Parses `content` (a String) and returns `{ target => [dep, ...] }`.
|
|
39
|
+
# Returns `{}` for nil/blank content. Never raises on malformed input --
|
|
40
|
+
# lines that don't contain a recognizable target/prerequisite separator are
|
|
41
|
+
# skipped rather than treated as an error, since a `.d` file may have been
|
|
42
|
+
# truncated by an interrupted build or hand-edited.
|
|
43
|
+
def parse(content)
|
|
44
|
+
targets = {}
|
|
45
|
+
return targets if content.nil?
|
|
46
|
+
|
|
47
|
+
join_line_continuations( content ).each_line do |line|
|
|
48
|
+
line = line.strip
|
|
49
|
+
next if line.empty?
|
|
50
|
+
|
|
51
|
+
m = line.match( SEPARATOR_RE )
|
|
52
|
+
next if m.nil?
|
|
53
|
+
|
|
54
|
+
target_tokens = tokenize( m[1] )
|
|
55
|
+
dep_tokens = tokenize( m[2] )
|
|
56
|
+
|
|
57
|
+
target_tokens.each do |target|
|
|
58
|
+
(targets[target] ||= []).concat( dep_tokens )
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
targets.transform_values { |deps| deps.uniq }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
### Private ###
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def join_line_continuations(content)
|
|
69
|
+
content.gsub( /\\\r?\n/, ' ' )
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def tokenize(text)
|
|
73
|
+
return [] if text.nil?
|
|
74
|
+
text.scan( TOKEN_RE ).map { |token| unescape( token ) }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# gcc escapes only spaces and `#` (Makefile comment character) with a
|
|
78
|
+
# backslash in its dependency output. Backslashes are otherwise significant
|
|
79
|
+
# and literal -- most notably as Windows path separators (`C:\proj\foo.c`)
|
|
80
|
+
# -- so only these two specific escapes are unescaped; any other backslash
|
|
81
|
+
# is left exactly as-is.
|
|
82
|
+
def unescape(token)
|
|
83
|
+
token.gsub( /\\([ #])/ ) { $1 }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
data/lib/ceedling/encodinator.rb
CHANGED
|
@@ -7,20 +7,32 @@
|
|
|
7
7
|
|
|
8
8
|
# Patch the string class so that we have a nice shortcut for cleaning string encodings
|
|
9
9
|
class String
|
|
10
|
+
# Clean up any oddball characters in an otherwise ASCII document. Hoisted to a
|
|
11
|
+
# frozen constant rather than rebuilt on every clean_encoding call -- a fresh
|
|
12
|
+
# Hash literal every call was a measurable, needless allocation back when the
|
|
13
|
+
# two highest-volume callers (ParsingParcels#code_lines_with_num,
|
|
14
|
+
# PreprocessinatorReconstructor#_scan_expansion_for_file) each called this
|
|
15
|
+
# per line; both now clean a whole buffer once instead, but the remaining
|
|
16
|
+
# per-line fallback-path callers (e.g. CPreprocessorConditionals#process_directive)
|
|
17
|
+
# still benefit. Only :replace varies by caller (default '' vs. e.g. '_' from
|
|
18
|
+
# defineinator.rb), so the common, default-safe_char case reuses this
|
|
19
|
+
# constant untouched; a non-default safe_char still allocates one small
|
|
20
|
+
# merged Hash, same as before.
|
|
21
|
+
DEFAULT_CLEAN_ENCODING_OPTIONS = {
|
|
22
|
+
:invalid => :replace, # Replace invalid byte sequences
|
|
23
|
+
:undef => :replace, # Replace anything not defined in ASCII
|
|
24
|
+
:replace => '', # Use a safe character for those replacements
|
|
25
|
+
:universal_newline => true # Always break lines with \n
|
|
26
|
+
}.freeze
|
|
27
|
+
|
|
10
28
|
def clean_encoding(safe_char = '')
|
|
11
29
|
begin
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
:invalid => :replace, # Replace invalid byte sequences
|
|
15
|
-
:undef => :replace, # Replace anything not defined in ASCII
|
|
16
|
-
:replace => safe_char, # Use a safe character for those replacements
|
|
17
|
-
:universal_newline => true # Always break lines with \n
|
|
18
|
-
}
|
|
19
|
-
|
|
30
|
+
encoding_options = safe_char.empty? ? DEFAULT_CLEAN_ENCODING_OPTIONS : DEFAULT_CLEAN_ENCODING_OPTIONS.merge(:replace => safe_char)
|
|
31
|
+
|
|
20
32
|
return self.encode("ASCII", **encoding_options).encode('UTF-8', **encoding_options)
|
|
21
|
-
rescue
|
|
33
|
+
rescue
|
|
22
34
|
raise "String contains characters that can't be represented in standard ASCII / UTF-8."
|
|
23
|
-
end
|
|
24
|
-
self
|
|
35
|
+
end
|
|
36
|
+
self
|
|
25
37
|
end
|
|
26
38
|
end
|