ceedling 1.2.0 → 1.2.2
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/GIT_COMMIT_SHA +1 -1
- data/README.md +57 -58
- data/Rakefile +5 -3
- data/assets/features/ceedling +1 -1
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_typo.c +14 -0
- data/assets/fixtures/tests_with_duplicate_test_names/test_foo.c +21 -0
- data/bin/actionator.rb +6 -12
- data/bin/app_cfg.rb +35 -1
- data/bin/ceedling +13 -3
- data/bin/cli.rb +25 -6
- data/bin/cli_handler.rb +119 -73
- data/bin/cli_helper.rb +56 -78
- data/bin/installation_selector.rb +81 -0
- data/bin/launchinator.rb +69 -0
- data/bin/mixin_resolvinator.rb +26 -36
- data/bin/objects.yml +13 -0
- data/bin/path_validator.rb +25 -29
- data/bin/versionator.rb +47 -48
- data/ceedling.gemspec +19 -15
- data/docs/BreakingChanges.md +70 -1
- data/docs/Changelog.md +84 -3
- data/docs/KnownIssues.md +90 -4
- data/docs/ReleaseNotes.md +13 -0
- data/docs/overrides/main.html +11 -8
- data/lib/ceedling/build_log_writer.rb +33 -0
- data/lib/ceedling/config/build_root_policy.rb +70 -0
- data/lib/ceedling/config/configurator.rb +19 -18
- data/lib/ceedling/config/configurator_builder.rb +58 -28
- data/lib/ceedling/config/configurator_paths_validator.rb +179 -0
- data/lib/ceedling/config/configurator_plugins.rb +1 -1
- data/lib/ceedling/config/configurator_setup.rb +39 -41
- data/lib/ceedling/config/configurator_validator.rb +1 -110
- data/lib/ceedling/defaults.rb +4 -4
- data/lib/ceedling/dependencies/README.md +18 -16
- data/lib/ceedling/dependencies/dependency_cache_store.rb +20 -3
- data/lib/ceedling/dependencies/dependency_hasher.rb +35 -1
- data/lib/ceedling/filename_extension.rb +7 -1
- data/lib/ceedling/filesystem/FILE_TREE.md +253 -0
- data/lib/ceedling/filesystem/PATH_HANDLING.md +304 -0
- data/lib/ceedling/filesystem/README.md +41 -0
- data/lib/ceedling/filesystem/build_subpath.rb +102 -0
- data/lib/ceedling/filesystem/destination_collision.rb +25 -0
- data/lib/ceedling/{file_finder.rb → filesystem/file_finder.rb} +159 -104
- data/lib/ceedling/{file_finder_helper.rb → filesystem/file_finder_helper.rb} +36 -31
- data/lib/ceedling/filesystem/file_path_collection_utils.rb +183 -0
- data/lib/ceedling/{file_path_utils.rb → filesystem/file_path_utils.rb} +108 -97
- data/lib/ceedling/{file_system_wrapper.rb → filesystem/file_system_wrapper.rb} +6 -5
- data/lib/ceedling/filesystem/file_tree.rb +241 -0
- data/lib/ceedling/{file_wrapper.rb → filesystem/file_wrapper.rb} +65 -28
- data/lib/ceedling/filesystem/path_exclusions.rb +30 -0
- data/lib/ceedling/{path_matcher.rb → filesystem/path_matcher.rb} +27 -23
- data/lib/ceedling/{path_mirror.rb → filesystem/path_mirror.rb} +19 -18
- data/lib/ceedling/filesystem/path_spellings.rb +55 -0
- data/lib/ceedling/filesystem/project_paths.rb +184 -0
- data/lib/ceedling/filesystem/working_dir.rb +40 -0
- data/lib/ceedling/generators/generator.rb +5 -6
- data/lib/ceedling/generators/generator_partials.rb +1 -1
- data/lib/ceedling/generators/generator_test_results_backtrace.rb +7 -7
- data/lib/ceedling/handoff.rb +121 -0
- data/lib/ceedling/includes/include_factory.rb +3 -3
- data/lib/ceedling/includes/include_pathinator.rb +67 -10
- data/lib/ceedling/includes/includes.rb +1 -1
- data/lib/ceedling/installation.rb +92 -0
- data/lib/ceedling/library_resolver.rb +99 -0
- data/lib/ceedling/objects.yml +23 -2
- data/lib/ceedling/partials/partializer.rb +4 -4
- data/lib/ceedling/partials/partializer_config.rb +3 -1
- data/lib/ceedling/plugins/report_log_writer_plugin.rb +3 -5
- data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +1 -1
- data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +1 -1
- data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +1 -1
- data/lib/ceedling/rake_app/rakefile_component_resolver.rb +10 -17
- data/lib/ceedling/rake_app/test_task_name.rb +29 -0
- data/lib/ceedling/rakefile.rb +16 -1
- data/lib/ceedling/rakefiles/base/tasks_base.rake +1 -1
- data/lib/ceedling/rakefiles/release/rules_release.rake +4 -7
- data/lib/ceedling/rakefiles/tests/rules_tests.rake +3 -20
- data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +4 -30
- data/lib/ceedling/release_invoker/release_build_executor.rb +33 -44
- data/lib/ceedling/release_invoker/release_build_planner.rb +14 -6
- data/lib/ceedling/reportinator.rb +3 -4
- data/lib/ceedling/setupinator.rb +95 -87
- data/lib/ceedling/test_context_extractor.rb +5 -1
- data/lib/ceedling/test_invoker/PIPELINE.md +9 -7
- data/lib/ceedling/test_invoker/mock_locator.rb +60 -2
- data/lib/ceedling/test_invoker/partials_manager.rb +12 -0
- data/lib/ceedling/test_invoker/standin_headerinator.rb +22 -13
- data/lib/ceedling/test_invoker/test_build_executor.rb +42 -41
- data/lib/ceedling/test_invoker/test_build_planner.rb +37 -18
- data/lib/ceedling/test_invoker/test_build_setup.rb +17 -12
- data/lib/ceedling/test_invoker/test_build_validations.rb +16 -31
- data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +1 -1
- data/lib/ceedling/test_invoker/test_invoker.rb +6 -1
- data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +1 -1
- data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +40 -20
- data/lib/ceedling/tool_executor.rb +9 -3
- data/lib/ceedling/yaml_wrapper.rb +3 -2
- data/lib/version.rb +1 -1
- data/plugins/bullseye/bullseye.rake +6 -9
- data/plugins/bullseye/config/defaults_bullseye.rb +1 -1
- data/plugins/bullseye/lib/bullseye.rb +9 -7
- data/plugins/cppcheck/config/defaults_cppcheck.rb +1 -1
- data/plugins/dependencies/config/defaults.yml +6 -6
- data/plugins/dependencies/dependencies.rake +4 -1
- data/plugins/dependencies/lib/dependencies.rb +18 -8
- data/plugins/dependencies/lib/dependency_spec.rb +17 -5
- data/plugins/fff/lib/fff.rb +45 -39
- data/plugins/fff/spec/fff_cmock_wrapper_spec.rb +128 -0
- data/plugins/gcov/config/defaults_gcov.rb +1 -1
- data/plugins/gcov/gcov.rake +6 -9
- data/plugins/gcov/lib/console_reportinator.rb +4 -18
- data/plugins/gcov/lib/gcov.rb +9 -2
- data/plugins/gcov/lib/gcovr_reportinator.rb +8 -40
- data/plugins/gcov/lib/gcovr_thresholds.rb +74 -0
- data/plugins/gcov/lib/reportgenerator_reportinator.rb +1 -1
- data/plugins/module_generator/lib/module_generator.rb +3 -3
- data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +53 -80
- data/plugins/sanitize/lib/sanitize_records.rb +3 -6
- data/plugins/sanitize/sanitize.rake +6 -6
- data/plugins/valgrind/lib/valgrind.rb +14 -7
- data/plugins/valgrind/valgrind.rake +6 -6
- data/site-local/404.html +6 -20
- data/site-local/assets/javascripts/{bundle.d7400e89.min.js → bundle.c21346df.min.js} +3 -3
- data/site-local/assets/javascripts/{bundle.d7400e89.min.js.map → bundle.c21346df.min.js.map} +2 -2
- data/site-local/assets/javascripts/workers/{search.2c215733.min.js → search.a7633da7.min.js} +2 -2
- data/site-local/assets/javascripts/workers/{search.2c215733.min.js.map → search.a7633da7.min.js.map} +1 -1
- data/site-local/assets/stylesheets/main.57a0d79d.min.css +6 -0
- data/site-local/assets/stylesheets/main.57a0d79d.min.css.map +1 -0
- data/site-local/assets/stylesheets/palette.fb2fffe2.min.css +4 -0
- data/site-local/assets/stylesheets/palette.fb2fffe2.min.css.map +1 -0
- data/site-local/configuration/environment-vars.html +6 -20
- data/site-local/configuration/global-collections.html +6 -20
- data/site-local/configuration/index.html +6 -20
- data/site-local/configuration/loading.html +6 -20
- data/site-local/configuration/mixins.html +10 -24
- data/site-local/configuration/parallel-builds.html +6 -20
- data/site-local/configuration/project-file.html +8 -22
- data/site-local/configuration/reference/cexception.html +6 -20
- data/site-local/configuration/reference/cmock.html +8 -21
- data/site-local/configuration/reference/defines.html +16 -30
- data/site-local/configuration/reference/environment.html +10 -24
- data/site-local/configuration/reference/extension.html +6 -20
- data/site-local/configuration/reference/files.html +22 -30
- data/site-local/configuration/reference/flags.html +13 -27
- data/site-local/configuration/reference/index.html +6 -20
- data/site-local/configuration/reference/libraries.html +27 -23
- data/site-local/configuration/reference/mixins.html +6 -20
- data/site-local/configuration/reference/partials.html +6 -20
- data/site-local/configuration/reference/paths.html +38 -29
- data/site-local/configuration/reference/plugins.html +6 -20
- data/site-local/configuration/reference/project.html +32 -36
- data/site-local/configuration/reference/release-build.html +8 -20
- data/site-local/configuration/reference/test-build.html +6 -20
- data/site-local/configuration/reference/test-runner.html +6 -20
- data/site-local/configuration/reference/tools.html +27 -32
- data/site-local/configuration/reference/unity.html +6 -20
- data/site-local/configuration/which-ceedling.html +383 -37
- data/site-local/development/index.html +6 -20
- data/site-local/development/plugins/configuration.html +6 -20
- data/site-local/development/plugins/index.html +6 -20
- data/site-local/development/plugins/plugin-subclass.html +54 -68
- data/site-local/development/plugins/rake-tasks.html +8 -22
- data/site-local/development/releases.html +84 -29
- data/site-local/development/workflow.html +62 -71
- data/site-local/getting-started/builds.html +8 -20
- data/site-local/getting-started/command-line.html +62 -24
- data/site-local/getting-started/example-projects/cipher-quest.html +6 -20
- data/site-local/getting-started/example-projects/index.html +6 -20
- data/site-local/getting-started/example-projects/temp-sensor.html +6 -20
- data/site-local/getting-started/example-projects/wondrous-forest.html +6 -20
- data/site-local/getting-started/index.html +6 -20
- data/site-local/getting-started/installation.html +6 -20
- data/site-local/getting-started/quick-start.html +6 -20
- data/site-local/help.html +6 -20
- data/site-local/index.html +11 -24
- data/site-local/overview/build-system.html +6 -20
- data/site-local/overview/index.html +6 -20
- data/site-local/overview/test-environments.html +6 -20
- data/site-local/overview/tools-and-frameworks.html +6 -20
- data/site-local/plugins/beep.html +6 -20
- data/site-local/plugins/bullseye/index.html +13 -24
- data/site-local/plugins/bullseye/licensing.html +14 -28
- data/site-local/plugins/command-hooks.html +8 -22
- data/site-local/plugins/compile-commands-json-db.html +6 -20
- data/site-local/plugins/cppcheck.html +8 -22
- data/site-local/plugins/dependencies.html +16 -27
- data/site-local/plugins/fff.html +49 -32
- data/site-local/plugins/gcov/examples.html +7 -21
- data/site-local/plugins/gcov/gcovr.html +22 -33
- data/site-local/plugins/gcov/index.html +6 -20
- data/site-local/plugins/gcov/overview.html +9 -20
- data/site-local/plugins/gcov/reportgenerator.html +9 -23
- data/site-local/plugins/gcov/reporting.html +6 -20
- data/site-local/plugins/gcov/setup.html +8 -21
- data/site-local/plugins/gcov/tool-versions.html +6 -20
- data/site-local/plugins/gcov/troubleshooting.html +10 -24
- data/site-local/plugins/index.html +6 -20
- data/site-local/plugins/module-generator.html +21 -35
- data/site-local/plugins/report-build-warnings-log.html +53 -67
- data/site-local/plugins/report-tests-gtestlike-stdout.html +6 -20
- data/site-local/plugins/report-tests-ide-stdout.html +43 -57
- data/site-local/plugins/report-tests-log-factory.html +50 -64
- data/site-local/plugins/report-tests-pretty-stdout.html +7 -21
- data/site-local/plugins/report-tests-raw-output-log.html +9 -21
- data/site-local/plugins/report-tests-teamcity-stdout.html +20 -31
- data/site-local/plugins/sanitize.html +56 -65
- data/site-local/plugins/valgrind.html +49 -58
- data/site-local/project/index.html +6 -20
- data/site-local/project/release-history.html +6 -20
- data/site-local/project/sbom.html +6 -20
- data/site-local/project/upgrade.html +9 -20
- data/site-local/reference/build-directives.html +6 -20
- data/site-local/reference/command-line.html +15 -22
- data/site-local/reference/environment-vars.html +6 -20
- data/site-local/reference/gcov-plugin.html +6 -20
- data/site-local/reference/global-collections.html +6 -20
- data/site-local/reference/index.html +6 -20
- data/site-local/reference/partials-macros.html +6 -20
- data/site-local/reference/project-configuration.html +6 -20
- data/site-local/sitemap.xml.gz +0 -0
- data/site-local/snapshot/examples/cipher_quest/index.html +16 -30
- data/site-local/snapshot/examples/temp_sensor/index.html +8 -22
- data/site-local/snapshot/examples/wondrous_forest/index.html +6 -20
- data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +1 -1
- data/site-local/snapshot/plugins/gcov/config/defaults_gcov.rb +1 -1
- data/site-local/testing-guide/build-directives.html +14 -28
- data/site-local/testing-guide/conventions.html +66 -27
- data/site-local/testing-guide/frameworks.html +11 -25
- data/site-local/testing-guide/index.html +6 -20
- data/site-local/testing-guide/partials/configuration.html +8 -22
- data/site-local/testing-guide/partials/conventions.html +8 -22
- data/site-local/testing-guide/partials/directives.html +16 -30
- data/site-local/testing-guide/partials/example.html +14 -28
- data/site-local/testing-guide/partials/index.html +6 -20
- data/site-local/testing-guide/partials/overview.html +6 -20
- data/site-local/testing-guide/partials/variables.html +11 -25
- data/site-local/testing-guide/test-cases.html +13 -27
- data/site-local/testing-guide/test-sample.html +12 -26
- data/site-local/testing-guide/test-suite-anatomy.html +6 -20
- data/spec/integration/actionator_file_operations_spec.rb +91 -1
- data/spec/integration/compile_commands_json_db_spec.rb +1 -1
- data/spec/integration/configurator_pipeline_spec.rb +10 -0
- data/spec/integration/configurator_validation_spec.rb +1 -1
- data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +26 -0
- data/spec/integration/dependencies/dependency_tracker_core_spec.rb +62 -0
- data/spec/integration/launcher_handoff_spec.rb +297 -0
- data/spec/integration/mixin_loading_spec.rb +1 -1
- data/spec/integration/module_generator_spec.rb +3 -3
- data/spec/integration/nested_test_artifacts_spec.rb +99 -0
- data/spec/integration/partials_module_resolution_spec.rb +7 -4
- data/spec/integration/path_intake_scenarios_spec.rb +101 -0
- data/spec/integration/path_scenarios_spec.rb +322 -0
- data/spec/integration/quote_include_isolator_spec.rb +1 -1
- data/spec/integration/rake_task_registry_plugins_spec.rb +95 -0
- data/spec/integration/report_build_warnings_log_spec.rb +1 -1
- data/spec/integration/report_tests_log_factory_spec.rb +1 -1
- data/spec/integration/test_executable_manifest_spec.rb +1 -1
- data/spec/integration/test_includes_extractinator_spec.rb +2 -1
- data/spec/integration/test_naming_spec.rb +198 -0
- data/spec/integration/test_source_file_checks_spec.rb +166 -0
- data/spec/integration/tool_validator_spec.rb +1 -1
- data/spec/integration/upgrade_docs_spec.rb +84 -0
- data/spec/integration/vendor_copy_transient_io_retry_spec.rb +192 -75
- data/spec/support/file_tree_helper.rb +88 -0
- data/spec/support/integration/configurator_integration_helper.rb +10 -7
- data/spec/support/integration/dependency_tracker_integration_helper.rb +1 -1
- data/spec/support/integration/partials_generation_integration_helper.rb +2 -2
- data/spec/support/integration/path_scenario_harness.rb +173 -0
- data/spec/support/integration/spec_integration_helper.rb +1 -1
- data/spec/support/integration/test_includes_harness.rb +13 -2
- data/spec/support/spec_helper.rb +2 -0
- data/spec/support/system/spec_system_helper.rb +7 -6
- data/spec/support/system/system_context.rb +21 -3
- data/spec/support/working_dir_tracking.rb +49 -0
- data/spec/system/build_output_mirroring_spec.rb +2 -2
- data/spec/system/conditional_mock_includes_spec.rb +1 -1
- data/spec/system/delta_builds_spec.rb +137 -11
- data/spec/system/gcov_deployment_spec.rb +1 -0
- data/spec/system/header_include_path_validation_spec.rb +4 -4
- data/spec/system/launcher_handoff_spec.rb +82 -0
- data/spec/system/mock_include_folders_spec.rb +91 -0
- data/spec/system/parent_directory_reference_spec.rb +5 -3
- data/spec/system/path_handling_probes_spec.rb +192 -0
- data/spec/system/preprocessing_parameterized_tests_spec.rb +1 -1
- data/spec/system/rake_release_task_path_disambiguation_spec.rb +6 -6
- data/spec/system/rake_test_task_path_disambiguation_spec.rb +85 -0
- data/spec/system/special_path_characters_spec.rb +86 -0
- data/spec/system/support/common_test_cases.rb +23 -21
- data/spec/system/support/gcov_common_test_cases.rb +37 -9
- data/spec/system/support/sanitize_common_test_cases.rb +2 -2
- data/spec/system/support/valgrind_common_test_cases.rb +12 -12
- data/spec/system/test_pipeline_stop_points_spec.rb +4 -4
- data/spec/system/test_runner_system_include_spec.rb +1 -1
- data/spec/system/test_source_file_directive_spec.rb +34 -5
- data/spec/units/bin/actionator_spec.rb +14 -17
- data/spec/units/bin/app_cfg_spec.rb +47 -0
- data/spec/units/bin/cli_handler_spec.rb +284 -7
- data/spec/units/bin/cli_helper_spec.rb +126 -45
- data/spec/units/bin/installation_selector_spec.rb +114 -0
- data/spec/units/bin/launchinator_spec.rb +171 -0
- data/spec/units/bin/path_validator_spec.rb +10 -0
- data/spec/units/bin/versionator_spec.rb +38 -6
- data/spec/units/build_log_writer_spec.rb +57 -0
- data/spec/units/config/build_root_policy_spec.rb +61 -0
- data/spec/units/config/configurator_builder_spec.rb +37 -6
- data/spec/units/config/configurator_paths_validator_spec.rb +292 -0
- data/spec/units/config/configurator_setup_spec.rb +65 -103
- data/spec/units/config/configurator_spec.rb +37 -6
- data/spec/units/config/configurator_validator_spec.rb +1 -172
- data/spec/units/default_tools_quoting_spec.rb +83 -0
- data/spec/units/dependencies/dependency_cache_store_spec.rb +33 -2
- data/spec/units/dependencies/dependency_debug_tree_spec.rb +1 -1
- data/spec/units/dependencies/dependency_hasher_spec.rb +42 -1
- data/spec/units/dependencies/dependency_path_normalizer_spec.rb +1 -1
- data/spec/units/dependencies/dependency_tracker_spec.rb +3 -1
- data/spec/units/filename_extension_spec.rb +11 -0
- data/spec/units/filesystem/build_subpath_spec.rb +122 -0
- data/spec/units/filesystem/destination_collision_spec.rb +30 -0
- data/spec/units/{file_finder_helper_spec.rb → filesystem/file_finder_helper_spec.rb} +46 -1
- data/spec/units/{file_finder_spec.rb → filesystem/file_finder_spec.rb} +188 -22
- data/spec/units/{file_path_collection_utils_spec.rb → filesystem/file_path_collection_utils_spec.rb} +181 -1
- data/spec/units/{file_path_utils_spec.rb → filesystem/file_path_utils_spec.rb} +204 -87
- data/spec/units/filesystem/file_system_wrapper_spec.rb +33 -0
- data/spec/units/filesystem/file_tree_spec.rb +511 -0
- data/spec/units/filesystem/file_tree_windows_spec.rb +78 -0
- data/spec/units/{file_wrapper_spec.rb → filesystem/file_wrapper_spec.rb} +154 -32
- data/spec/units/{path_matcher_spec.rb → filesystem/path_matcher_spec.rb} +12 -1
- data/spec/units/{path_mirror_spec.rb → filesystem/path_mirror_spec.rb} +32 -4
- data/spec/units/filesystem/project_paths_spec.rb +147 -0
- data/spec/units/filesystem/working_dir_spec.rb +71 -0
- data/spec/units/generators/generator_spec.rb +12 -6
- data/spec/units/generators/generator_test_results_backtrace_spec.rb +50 -46
- data/spec/units/generators/generator_test_results_spec.rb +1 -1
- data/spec/units/handoff_spec.rb +205 -0
- data/spec/units/includes/include_factory_spec.rb +3 -3
- data/spec/units/includes/include_pathinator_spec.rb +46 -0
- data/spec/units/installation_spec.rb +228 -0
- data/spec/units/library_resolver_spec.rb +157 -0
- data/spec/units/mock_locator_spec.rb +76 -1
- data/spec/units/partials/partializer_config_spec.rb +7 -0
- data/spec/units/partials/partializer_spec.rb +1 -0
- data/spec/units/partials_manager_spec.rb +17 -0
- data/spec/units/plugins/bullseye_spec.rb +15 -2
- data/spec/units/plugins/console_reportinator_spec.rb +18 -20
- data/spec/units/plugins/dependencies_spec.rb +33 -7
- data/spec/units/plugins/dependency_spec_spec.rb +17 -0
- data/spec/units/plugins/gcov_spec.rb +28 -3
- data/spec/units/plugins/gcovr_reportinator_spec.rb +19 -47
- data/spec/units/plugins/gcovr_thresholds_spec.rb +95 -0
- data/spec/units/plugins/module_generator_spec.rb +5 -5
- data/spec/units/plugins/report_build_warnings_log_spec.rb +3 -3
- data/spec/units/plugins/report_log_writer_plugin_spec.rb +10 -1
- data/spec/units/plugins/report_tests_raw_output_log_spec.rb +13 -2
- data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +77 -3
- data/spec/units/plugins/reportgenerator_reportinator_spec.rb +1 -1
- data/spec/units/plugins/sanitize_records_spec.rb +3 -1
- data/spec/units/plugins/sanitize_spec.rb +1 -1
- data/spec/units/plugins/valgrind_spec.rb +23 -8
- data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +1 -1
- data/spec/units/rake_app/rakefile_component_resolver_spec.rb +21 -0
- data/spec/units/rake_app/test_task_name_spec.rb +47 -0
- data/spec/units/release_build_executor_spec.rb +53 -14
- data/spec/units/release_build_planner_spec.rb +15 -3
- data/spec/units/reportinator_spec.rb +5 -5
- data/spec/units/standin_headerinator_spec.rb +31 -1
- data/spec/units/test_build_executor_spec.rb +107 -5
- data/spec/units/test_build_planner_spec.rb +104 -2
- data/spec/units/test_build_setup_spec.rb +96 -12
- data/spec/units/test_context_extractor_spec.rb +25 -0
- data/spec/units/test_file_preprocessinator_spec.rb +17 -1
- data/spec/units/test_includes_extractinator_spec.rb +5 -1
- data/spec/units/test_invoker/objects_wiring_spec.rb +6 -3
- data/spec/units/test_invoker_spec.rb +14 -1
- data/spec/units/test_source_file_directive_resolver_spec.rb +38 -7
- data/spec/units/tool_executor_spec.rb +26 -0
- data/spec/units/yaml_wrapper_spec.rb +11 -0
- metadata +122 -33
- data/lib/ceedling/file_path_collection_utils.rb +0 -164
- data/site-local/assets/stylesheets/main.ec1eaa64.min.css +0 -1
- data/site-local/assets/stylesheets/main.ec1eaa64.min.css.map +0 -1
- data/site-local/assets/stylesheets/palette.ab4e12ef.min.css +0 -1
- data/site-local/assets/stylesheets/palette.ab4e12ef.min.css.map +0 -1
data/docs/Changelog.md
CHANGED
|
@@ -8,6 +8,87 @@ This changelog is complemented by three other documents:
|
|
|
8
8
|
1. 💔 **[Breaking Changes](BreakingChanges.md)** for a list of impacts to existing Ceedling projects.
|
|
9
9
|
1. 🐛 **[Known Issues](KnownIssues.md)** for a list of presently known problems and limitations.
|
|
10
10
|
|
|
11
|
+
Each release has its own section, listing only what changed in that release.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# [1.2.2] — 2026-10-31
|
|
16
|
+
|
|
17
|
+
## 💪 Fixed
|
|
18
|
+
|
|
19
|
+
- Fixed the [Valgrind plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/valgrind/) writing no report, and reporting a crash, for any test below its test root. The [Raw Output Log plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-tests-raw-output-log/) failed to write such a test’s log.
|
|
20
|
+
- Fixed [`:use_backtrace: :gdb`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/project/#use_backtrace) logs of same-named tests sharing one file, and every log collecting crashes from earlier builds. A crash summary pointed to a log whose first trace could be stale. Each test now has its own logs, and each holds only the latest crash.
|
|
21
|
+
- Fixed [TeamCity plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-tests-teamcity-stdout/) naming the suites of same-named tests alike. A suite is now named by its test’s path, and escaped as TeamCity requires.
|
|
22
|
+
- [#1369](https://github.com/ThrowTheSwitch/Ceedling/issues/1369) Fixed [TeamCity](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-tests-teamcity-stdout/) test names and failure details going out unescaped. A test path or case name holding `'`, `|`, `[`, `]`, or a line break broke the service message, and TeamCity misread or dropped the test’s result.
|
|
23
|
+
- Fixed checking of [`TEST_SOURCE_FILE()`](https://docs.throwtheswitch.org/Ceedling/1.2.0/testing-guide/build-directives/#test_source_file) entries:
|
|
24
|
+
- Each test now checks only its own entries, removing unnecessarily duplicated checks yielding a test build speedup.
|
|
25
|
+
- A misspelled entry now stops the build with an error naming its own test. Previously, the error could name another test, and with [`:use_test_preprocessor`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/project/#use_test_preprocessor) `:none` or `:mocks` the entry went unchecked (see [Breaking Changes](BreakingChanges.md)).
|
|
26
|
+
- An entry using `..` is no longer rejected with test preprocessing on.
|
|
27
|
+
- A “Multiple files matched” notice now prints once a build, not once for every lookup that makes the same choice.
|
|
28
|
+
- Fixed a [delta build](https://docs.throwtheswitch.org/Ceedling/1.2.0/getting-started/builds/) keeping a test executable or release artifact after a source file left the build — deleted, excluded through `:files`, or moved outside `:paths` — while every other object was unchanged. A test kept passing on the removed code, even with `--force-test-rerun`, and a release artifact kept it. A link now rebuilds whenever its list of objects changes.
|
|
29
|
+
- [#1365](https://github.com/ThrowTheSwitch/Ceedling/issues/1365) Fixed a project that selects another Ceedling installation — through [`:project` ↳ `:which_ceedling`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/which-ceedling/), `WHICH_CEEDLING`, or a `vendor/ceedling/` copy — running on a mix of both installations’ code. Across versions it failed outright: a 1.2.1 `ceedling` could not run a project vendoring 1.2.0. A development checkout selected this way silently ran partly on the gem’s code. Each command now runs whole in the installation it selects (see _Changed_).
|
|
30
|
+
- Fixed [`ceedling version`](https://docs.throwtheswitch.org/Ceedling/1.2.0/getting-started/command-line/#ceedling-version) reporting the launcher’s version number for the application and ignoring a project’s `:which_ceedling`. It now reads your project file and takes `--project` and `--mixin`.
|
|
31
|
+
- Fixed `ceedling new`, `ceedling example`, and `ceedling examples` running the launcher’s code with the installation `WHICH_CEEDLING` selects, and `new` recording the launcher’s version in `:ceedling_version:`. `docs` ignored the selection. It now exports the selected installation’s documentation, or the launcher’s with a notice when the selected installation holds none, as a `--local` copy does not.
|
|
32
|
+
- Fixed `ceedling upgrade` run inside a `--local` project deleting the project’s vendored Ceedling and then failing to copy from it (see [Breaking Changes](BreakingChanges.md)).
|
|
33
|
+
- [#1371](https://github.com/ThrowTheSwitch/Ceedling/issues/1371) Fixed `ceedling upgrade` never refreshing documentation that `new --docs` or `example --docs` exported since 1.1.0. It now replaces only what the export wrote, and leaves your own files in `docs/`. Previously, a project exported by 1.0.x lost all of `docs/`.
|
|
34
|
+
- Fixed a `--local` project’s `./ceedling` failing since 1.1.0 with “`vendor/ceedling/vendor/unity/test/targets` does not exist”. Vendoring now copies Unity’s built-in mixins. Re-vendor an existing project with `ceedling upgrade`.
|
|
35
|
+
- Fixed the `./ceedling` launch script splitting arguments that contain spaces, such as `--test-case="adds two"` or an inline YAML `--mixin`.
|
|
36
|
+
- Fixed backslashes in a `WHICH_CEEDLING` or `:which_ceedling` path going unconverted.
|
|
37
|
+
- [#1366](https://github.com/ThrowTheSwitch/Ceedling/issues/1366) Fixed the [gcov plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/gcov/gcovr/#fail_under_decision) repeating gcovr’s first coverage threshold message for every violated `:fail_under_*` threshold, and losing the others. Each violated threshold is now its own build failure, with gcovr’s own message. From gcovr 8.7, `:fail_under_decision` also checks condition coverage, which `:mcdc` produces.
|
|
38
|
+
- [#1368](https://github.com/ThrowTheSwitch/Ceedling/issues/1368) Fixed a [delta build](https://docs.throwtheswitch.org/Ceedling/1.2.0/getting-started/builds/) not relinking a test or release when a library it links changes. A link now depends on the library files its [`:libraries`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/libraries/) entries name on `:paths` ↳ `:libraries`, and on the libraries the Dependencies plugin builds.
|
|
39
|
+
- Fixed a [Unity helper](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/cmock/#unity_helper_path) named by its header compiling that header instead of the source beside it. A helper written with backslashes was also included in mocks by its whole path.
|
|
40
|
+
- [#1377](https://github.com/ThrowTheSwitch/Ceedling/issues/1377) Fixed the [FFF plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/fff/#cmock-configuration) leaving out the headers that `:cmock` ↳ `:includes_c_pre_header`, `:includes_c_post_header`, and `:includes_h_pre_orig_header` name, so a fake could fail to compile where a mock of the same header compiled. Fakes now include them where CMock does. A [Unity helper](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/cmock/#unity_helper_path) is now included in a fake’s source, as in a mock’s.
|
|
41
|
+
- Fixed the [Dependencies plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/) placing an absolute artifact or include path below its `:artifact` path, and `:build_lib` writing its list files into the working directory.
|
|
42
|
+
|
|
43
|
+
### Path handling
|
|
44
|
+
|
|
45
|
+
The bulk of the fixes that follow are the consequence of funneling all path handling through common hygiene, standardized path creation beneath the project build root, and handling for a variety edge cases. While extensive, this list of fixes addresses problems most projects never encountered.
|
|
46
|
+
|
|
47
|
+
- [#1376](https://github.com/ThrowTheSwitch/Ceedling/issues/1376) Fixed the copy of Unity, CMock, and CException into the build directory failing when Ruby reports a vendored file as a directory, as it can for a Ruby installation on a Windows network share with Data Deduplication. The copy left a directory where the file belongs, and every later build failed on it. Ceedling now tells files from directories without that misreport, and replaces any entry of the wrong type with a notice. `ceedling new --local`, `upgrade`, and `example` list what they copy the same way. This is best effort, since Ceedling cannot vouch for every filesystem (see [Known Issues](KnownIssues.md)).
|
|
48
|
+
- [#1364](https://github.com/ThrowTheSwitch/Ceedling/issues/1364) Fixed test builds stopping with “Ambiguous file reference” when a test file’s name ended another test file’s path, such as `test/test_calc.c` beside `test/unit/test_calc.c`. It stopped `test:all`, a test named by its full path, and plugin builds such as `gcov:all`. Each test is now properly [named by its path from the project root](https://docs.throwtheswitch.org/Ceedling/1.2.0/testing-guide/conventions/#test-names-build-output), and its build finds its own source by that name.
|
|
49
|
+
- Fixed two test files sharing one build name, so that one silently replaced the other: tests under overlapping `:paths` ↳ `:test` roots (e.g. `test/**` and `test/unit/**`), the same layout under two roots, or a `:files` ↳ `:test` test outside every root. Since 1.2.0, the error above hid it.
|
|
50
|
+
- Fixed a directory of tests named like a test beside it, such as `test/test_foo/` beside `test/test_foo.c`, making a mock both tests use ambiguous.
|
|
51
|
+
- [#1373](https://github.com/ThrowTheSwitch/Ceedling/issues/1373) Fixed tests failing to run under a path holding an apostrophe or a space. Every case reported a crash, or the build stopped. The default tools that run a test executable, and the tools for the CppCheck, Dependencies, and Valgrind plugins now quote the paths they name.
|
|
52
|
+
- [#1370](https://github.com/ThrowTheSwitch/Ceedling/issues/1370) Fixed mocking a header found below a `:paths` root such as `../**` beside headers far outside the project, such as `C:/Keil_v5/…`. The mock was written outside the build directory, and the build stopped with “Found no file … in search paths”. Ceedling now compares paths by the directories they name, not by their text.
|
|
53
|
+
- Fixed same-named sources in one build sharing one object, so that one silently replaced the other. This happened with release sources below two roots (e.g. `src/foo.c` and `lib/foo.c`), sources below nested roots (`src/util.c` and `src/legacy/util.c`), sources named by `:files`, gcov and Bullseye untested sources, and sources the Dependencies plugin’s `:build_lib` compiles. Each now builds to its own object (see _Changed_). Two sources that would still build to one file stop the build with an error naming both.
|
|
54
|
+
- Fixed a `:paths` entry written as `./src/**`, as an absolute path, or through a symlink not matching the same directories written as `src/**`. A header below such a root missed the source beside it, and its mock missed its directory.
|
|
55
|
+
- Fixed a `:paths` root such as `../**` or `./**` collecting the build directory’s own generated mocks, runners, and objects.
|
|
56
|
+
- Fixed a `:files` glob such as `+:**/*.c` collecting the build directory’s own mocks, runners, and vendored Unity and CMock sources, which stopped a release build. A `:files` glob now adds nothing from the build directory.
|
|
57
|
+
- Fixed a `:files` glob such as `+:**/*.c`, or a source root holding the test root, collecting test files into a release build, which then stopped compiling them. A `:files` revision also no longer adds a test file to the source collection.
|
|
58
|
+
- Fixed a `-:` `:paths` entry naming a directory that does not exist, such as one below the build root before a first build, failing validation. It now logs a warning, or nothing below the build root.
|
|
59
|
+
- Fixed `:project` ↳ `:build_root: .` letting `clobber` delete the project’s own `test/` directory. Such a build root is now refused (see [Breaking Changes](BreakingChanges.md)).
|
|
60
|
+
- Fixed `~` in a configured path naming a directory called `~`. It now names your home directory in `:paths`, `:files`, `:project` ↳ `:build_root`, every `*_path` setting, tool executables, mixins, `--project`, `--logfile`, `:which_ceedling`, `WHICH_CEEDLING`, plugin load paths, and the Dependencies plugin’s paths.
|
|
61
|
+
- Fixed `-L` linker arguments repeating `:paths` ↳ `:libraries` entries as written, decorators and globs included (see _Changed_).
|
|
62
|
+
- Fixed a [`TEST_INCLUDE_PATH()`](https://docs.throwtheswitch.org/Ceedling/1.2.0/testing-guide/build-directives/#test_include_path) written differently from its `:paths` entry, such as with `./`, ranking its headers last among same-named candidates.
|
|
63
|
+
- Fixed `test:` tasks naming a test with `./` or a leading `..`, such as `ceedling test:../tests/test_x`.
|
|
64
|
+
- Fixed mocks failing to compile in three cases: a mock whose `#include` folder shares the test file’s name, two same-named mocks told apart only by their `#include` folders, and a mock `#include` spelling more path than its header’s directory with [`:cmock` ↳ `:mock_name_include_folder`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/cmock/#mock_name_include_folder) disabled.
|
|
65
|
+
- Fixed an absolute [`:release_build` ↳ `:output`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/release-build/#output) placed below the release build directory. It now names the release itself, with its map file beside it.
|
|
66
|
+
- Fixed the log directory and plugin load paths ignoring inline Ruby string expansion and backslashes when read before configuration loads.
|
|
67
|
+
- Fixed a test in a project directory named `_up_` or `_abs_` sharing a build name with a test outside the project.
|
|
68
|
+
|
|
69
|
+
## ⚠️ Changed
|
|
70
|
+
|
|
71
|
+
- Each test’s build output, results, and logs now sit beneath [its path from the project root](https://docs.throwtheswitch.org/Ceedling/1.2.0/testing-guide/conventions/#test-names-build-output). `test/unit/test_calc.c`, once `unit/test_calc`, is now `test/unit/test_calc`, and a test at its root gains its root (e.g. `build/artifacts/valgrind/test/test_calc.log`). The first build after upgrading rebuilds everything once and logs a warning saying so. Run `ceedling clobber` to remove the output left in the old layout, which [coverage reports](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/gcov/) would otherwise still read. See [Breaking Changes](BreakingChanges.md).
|
|
72
|
+
- A command that selects another Ceedling installation now runs in that installation’s own process, handed off by the `ceedling` command you run. Both sides log a notice naming both versions. Every command except `version` hands off this way, adding about 0.2 seconds. See [Which Ceedling](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/which-ceedling/) and [Breaking Changes](BreakingChanges.md).
|
|
73
|
+
- A 1.2.2 application loaded by an older launcher into its own process warns and restarts in its own process.
|
|
74
|
+
- Each object, preprocessed file, and dependencies file now sits below its build directory at its source’s path from the project root. In test `test/test_uart`, `src/drivers/uart.c` builds to `build/test/out/test/test_uart/src/drivers/uart.o`, and a release builds it to `build/release/out/src/drivers/uart.o`. A source outside the project gains `_up_` for each `..` (e.g. `_up_/shared/src/crc.o`), and a file of the running Ceedling installation outside the project sits below `_ceedling_`. Mocks, runners, and vendored frameworks keep their places. The first build after upgrading recompiles each moved object once. See [Breaking Changes](BreakingChanges.md).
|
|
75
|
+
- A `-:` `:paths` entry now removes the directory it names and every directory below it, unless an additive entry names one of them more closely, as `+:src/legacy/keep` does beside `-:src/legacy`. See [Breaking Changes](BreakingChanges.md).
|
|
76
|
+
- A `:paths` or `:files` entry within the build root now logs a warning, and no entry collects from the directories Ceedling and its plugins create, such as `build/test/` or `build/vendor/`. See [Breaking Changes](BreakingChanges.md).
|
|
77
|
+
- `-L` linker arguments now name the directories `:paths` ↳ `:libraries` entries collect, as any `:paths` entry does. An entry that collects no existing directory adds no `-L` argument.
|
|
78
|
+
- Copying Unity, CMock, and CException into the build directory (for short paths and to alleviate possible network filesystem issues with a shared gem installation) retries a file only on an error that clears on its own, such as another program holding the file open, and fails at once on any other. Vendored files are always writable by their owner.
|
|
79
|
+
- `ceedling new --local`, `upgrade`, and `example` now copy the contents of a linked directory within a Ceedling installation, and stop on a link loop.
|
|
80
|
+
- Ceedling’s file and path code moved to `lib/ceedling/filesystem/`. A third-party plugin that requires one of its files directly must name the new path (see [Breaking Changes](BreakingChanges.md)). Plugin development currently makes no guarantees as to the location of internal Ceedling resources.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
# [1.2.1] — 2026-10-24
|
|
85
|
+
|
|
86
|
+
## 💪 Fixed
|
|
87
|
+
|
|
88
|
+
- [#1360](https://github.com/ThrowTheSwitch/Ceedling/issues/1360) Fixed a delta build reporting another run’s cached test results when the [`--test-case` or `--exclude_test_case`](https://docs.throwtheswitch.org/Ceedling/1.2.0/getting-started/command-line/#ceedling-test-test-casetest_case_name) filter changed between runs. It affected every project whose [`:use_backtrace`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/project/#use_backtrace) is not `:none`, including the `:simple` default. A changed filter now reruns the test executable without recompiling or relinking it. An unchanged filter still reuses the cached results.
|
|
89
|
+
- [#1361](https://github.com/ThrowTheSwitch/Ceedling/issues/1361) Fixed every command that loads a project, `files:test` and `dumpconfig` included, rewriting the vendored Unity, CMock, and CException sources in `build/vendor/` in place. A second command run while a build compiled could leave the compiler reading a half-written header. Only a test build or release build now brings `build/vendor/` up to date. A vendored file that already matches its source is no longer written, and one that differs (e.g. after an accidental edit) is replaced whole.
|
|
90
|
+
- [#1362](https://github.com/ThrowTheSwitch/Ceedling/issues/1362) Fixed [`gcov:`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/gcov/), [`valgrind:`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/valgrind/), [`sanitize:`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/sanitize/), and [`bullseye:`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/bullseye/) single-file tasks rejecting a project-relative path, such as `gcov:test/test_calculator.c`. They now accept a path to tell same-named test files apart, as [`test:` tasks](https://docs.throwtheswitch.org/Ceedling/1.2.0/getting-started/command-line/#ceedling-test) do.
|
|
91
|
+
|
|
11
92
|
---
|
|
12
93
|
|
|
13
94
|
# [1.2.0] — 2026-10-21
|
|
@@ -108,7 +189,7 @@ The new [Sanitize plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins
|
|
|
108
189
|
[#1110](https://github.com/ThrowTheSwitch/Ceedling/issues/1110) A dependency can now list the programs it builds under [`:artifacts` ↳ `:executables`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#executables) for tools rather than libraries. A release build or [`dependencies:make`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#ceedling-dependenciesmake) builds them when missing, test builds do not wait on them, and they are never linked. [`dependencies:deploy`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#ceedling-dependenciesdeploy) copies them, along with [dynamic libraries](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#dynamic_libraries), to a new optional [`:paths` ↳ `:deploy`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#working-paths) folder, by default beside the release executable.
|
|
109
190
|
|
|
110
191
|
### Build warnings plugin context, deduplication, and filtering
|
|
111
|
-
The [Build Warnings Log plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/) now logs each GCC or Clang warning with the lines that explain it — the function or include context before it along with the source line, caret, and any note after it. Each distinct warning is logged once per build context, so a header
|
|
192
|
+
The [Build Warnings Log plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/) now logs each GCC or Clang warning with the lines that explain it — the function or include context before it along with the source line, caret, and any note after it. Each distinct warning is logged once per build context, so a header’s warning appears once rather than once per file including it, and compiler summary lines are left out. New [`:patterns`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#patterns) and [`:excludes`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#excludes) settings optionally take regular expressions that replace the default match of any line mentioning “warning” and optionally drop warnings you have already accepted or prevent false positives.
|
|
112
193
|
|
|
113
194
|
### Build warnings plugin SARIF and JSON reports
|
|
114
195
|
The [Build Warnings Log plugin](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#reports) can now write its warnings as [SARIF](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#sarif-report) and [JSON](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#json-report) reports alongside, or instead of, its plain [text log](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#text-report). SARIF, the standard format for static analysis results, lets GitHub code scanning, Azure DevOps, SonarQube, Jenkins, and IDE viewers show each warning on the line it concerns. The [JSON report](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#json-report) lists each warning’s file, line, column, severity, flag, message, and context for scripts. The new [`:reports`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/report-build-warnings-log/#reports) setting selects any of `:text`, `:sarif`, and `:json`, and defaults to `:text`. The structured reports are written for every build context that ran a build step, even without warnings, so a CI step always finds its file.
|
|
@@ -196,10 +277,10 @@ Note: 1.2.0 includes all bug fixes for 1.1.x.
|
|
|
196
277
|
- [#1076](https://github.com/ThrowTheSwitch/Ceedling/issues/1076) Fixed a second [`dependencies:fetch`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#ceedling-dependenciesfetch), or a [`dependencies:make`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#ceedling-dependenciesmake) after a fetch, failing because `git clone` ran into the already-populated folder. A dependency whose fetch path holds files now counts as fetched, and [`dependencies:clean`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#ceedling-dependenciesclean) allows a fresh fetch. [Working paths](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#working-paths) are no longer created ahead of fetching, which made a clone into a fetch path containing the build path fail.
|
|
197
278
|
- [#1110](https://github.com/ThrowTheSwitch/Ceedling/issues/1110) Fixed [`dependencies:deploy`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#ceedling-dependenciesdeploy) trying to copy a file named for the dependency rather than its dynamic libraries. It now copies every [dynamic library](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#dynamic_libraries) from the artifact path beside the release executable.
|
|
198
279
|
- Fixed a [`:tar_gzip`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#fetching-dependencies) fetch from an absolute Windows path failing with "Cannot connect to D: resolve failed" where GNU tar, as Git for Windows provides, came first on the path. GNU tar reads a path beginning with a drive letter as a remote host, so `tar` now reads the archive on its standard input.
|
|
199
|
-
- Fixed a dependency
|
|
280
|
+
- Fixed a dependency’s [`:environment`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#environment-variables) variables lasting for the rest of the run, reaching every later dependency and Ceedling itself. They now apply only while that dependency’s commands run. An entry not of the form `NAME=value`, `NAME+=value`, or `NAME-=value` now stops the build rather than being ignored. Text after `+=` and `-=` now keeps its leading space, so an appended flag can carry the delimiter it needs.
|
|
200
281
|
- Fixed a dependency without [`:artifacts`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#artifacts) crashing the build. Configuration problems now stop the build with a message naming the dependency: a missing name, a name without letters or digits, two names sharing a task name, an unknown [fetch method](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#fetching-dependencies), or a fetch method missing its `:source` or `:executable`.
|
|
201
282
|
- Fixed an [`:includes`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#includes) glob under [`:artifacts`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#artifacts) expanding against the working directory rather than the artifact path, and joining every directory it found into one path.
|
|
202
|
-
- Fixed [`:build_lib`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#building-dependencies) depending on the process working directory, and miscomputing where to copy its library when the `:artifact` path was absolute or climbed with `..`. The [`:deps_compiler`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#custom-tools) tool now receives its search paths and defines as `${5}` and `${6}`, like Ceedling
|
|
283
|
+
- Fixed [`:build_lib`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#building-dependencies) depending on the process working directory, and miscomputing where to copy its library when the `:artifact` path was absolute or climbed with `..`. The [`:deps_compiler`](https://docs.throwtheswitch.org/Ceedling/1.2.0/plugins/dependencies/#custom-tools) tool now receives its search paths and defines as `${5}` and `${6}`, like Ceedling’s own [compilers](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/tools/#tool-element-runtime-substitution-notational-substitution).
|
|
203
284
|
|
|
204
285
|
### Valgrind & Cppcheck plugins
|
|
205
286
|
|
data/docs/KnownIssues.md
CHANGED
|
@@ -6,6 +6,8 @@ Known issues are complemented by three other documents:
|
|
|
6
6
|
1. 🪵 **[Changelog](Changelog.md)** for a structured list of additions, fixes, changes, and removals.
|
|
7
7
|
1. 💔 **[Breaking Changes](BreakingChanges.md)** for a list of impacts to existing Ceedling projects.
|
|
8
8
|
|
|
9
|
+
Each release has its own section, listing every issue known to affect it. An issue that persists appears again in each later release. A section for an earlier release closes by naming what a later release resolved. Before 1.2.0, a section covers a whole minor version.
|
|
10
|
+
|
|
9
11
|
---
|
|
10
12
|
|
|
11
13
|
## All versions
|
|
@@ -14,15 +16,89 @@ Known issues are complemented by three other documents:
|
|
|
14
16
|
|
|
15
17
|
---
|
|
16
18
|
|
|
19
|
+
## 1.2.2 — 2026-10-31
|
|
20
|
+
|
|
21
|
+
Ceedling 1.2.x requires Ruby 3+ but only unofficially supports Ruby 4.
|
|
22
|
+
|
|
23
|
+
1. The new internal pipeline as of 1.0.0 that allows builds to be parallelized and configured per-test-executable can mean a fair amount of duplication of steps. A header file may be mocked identically multiple times. The same source file may be compiled identically multiple times. Delta builds (as of 1.2.0) offer considerable build time savings as do the speedup gains due to parallelization as of 1.0.0. Future releases will optimize away duplication of build steps.
|
|
24
|
+
1. An `#include` directive must resolve to a file within your project’s configured `:paths` search collection. A path that would resolve outside your configured search paths (e.g. via relative paths beyond search paths or excessive `..` parent-directory segments) is now rejected with a clear, specific error rather than silently causing a confusing downstream build failure.
|
|
25
|
+
1. With test preprocessing enabled, a test file’s `#include` of a mock whose name comes from a macro defined only in a header, as in `#include MOCK_HEADER` with `MOCK_HEADER` defined in another header, cannot be found. Define the macro under `:defines` ↳ `:test` so the test file sees it directly.
|
|
26
|
+
1. Fallback preprocessing remains a best effort with no guarantees. It is used where your toolchain’s preprocessor does not support `-fdirectives-only` or where you force it with `:test_build` ↳ `:preprocess_force_fallback`. Its handling of conditional compilation is limited and may not resolve the same branches your compiler would. Macro expansion is not supported at all.
|
|
27
|
+
1. Delta builds track a library only when they find its file on `:paths` ↳ `:libraries`, or the Dependencies plugin builds it. An “untracked” library found only among your toolchain’s internal search paths, or through a `-L` written into `:flags`, relinks nothing when it changes. Run `ceedling clobber` after such a library changes.
|
|
28
|
+
1. On Linux and macOS, a test, source, or build path holding `"`, `$`, a backtick, or `\` can still break the commands Ceedling runs. So can any path in a tool you define with an unquoted `${1}`. Quote your own tools’ paths, as [`:tools`](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/reference/tools/) describes.
|
|
29
|
+
1. Paths for `TEST_SOURCE_FILE(...)` remain relative to **_project root_** — that is, from where you execute `ceedling` at the command line. If you move source files or change your directory structure, `TEST_SOURCE_FILE(...)` calls referencing moved files will need to be updated.
|
|
30
|
+
1. The `ceedling` command of an installation before 1.2.2, such as a 1.2.1 gem, loads a 1.2.2 application that a project selects into its own process. The 1.2.2 application restarts itself in its own process. `new`, `example`, `examples`, `upgrade`, `docs`, and `help` without a project never load the application, so they still run on the older installation’s code. Upgrade the Ceedling whose `ceedling` command you run, typically the gem, to 1.2.2.
|
|
31
|
+
1. The `ceedling` command you run parses your command line before it hands off to the installation a project selects. It rejects an option that only the selected installation knows. Run the selected installation’s own launcher instead, such as a `--local` project’s `./ceedling` launch script from the project root (`.\ceedling.cmd` on Windows).
|
|
32
|
+
1. A mock `#include` written relative to the test file that climbs with `..` to a directory the mock search paths do not reach, such as `#include "../src/drivers/mock_foo.h"`, fails to compile, as in earlier releases. Include the mock relative to a search path instead, such as `#include "drivers/mock_foo.h"`.
|
|
33
|
+
1. On Windows, a source far outside the project lengthens its build paths, since each `..` in its path from the project adds `_up_/`. Ceedling warns as a path nears Windows’ 260-character limit.
|
|
34
|
+
|
|
35
|
+
### Partials
|
|
36
|
+
|
|
37
|
+
1. A module whose header protects itself with `#pragma once` instead of a traditional `#ifndef` include guard can still hit a `redefinition` or `conflicting types` error, if any other header your module uses reaches that header in turn. Ceedling suppresses the real header by defining its include guard, and `#pragma once` provides no guard to define. Converting the module’s header to a traditional include guard works around it.
|
|
38
|
+
1. A type created by a macro invocation rather than written out — the list and queue building macros in `sys/queue.h`, for instance — is not recognized as a type, and a Partial using one fails to compile with an `unknown type name` error.
|
|
39
|
+
1. A `struct`, `union`, or `enum` written directly on a variable, as in `static struct { int depth; } slot;`, is treated as a variable alone. The generated Partial states the type twice and fails to compile.
|
|
40
|
+
1. A `struct`, `union`, or `enum` named but not defined, as in `struct node;`, is reproduced in the generated Partial as an invalid declaration. Builds treating warnings as errors fail on it.
|
|
41
|
+
1. A macro the module retires with `#undef` is carried into the generated Partial anyway, so the name stays visible to your test file and can collide with another macro of the same name.
|
|
42
|
+
1. Exposing a module’s file-scope variables and functions removes what kept their names private to that module. Two Partialized modules in one test file that each use the same name for a file-scope variable collide at link time.
|
|
43
|
+
1. Partials cannot generate a module that text-only fallback preprocessing is unable to resolve — a module with an `#include` naming a macro, or with a type behind a conditional expression that cannot be evaluated without a real preprocessor. Ceedling stops the build and names the file and line rather than generating something subtly wrong. Fallback preprocessing is only used where your compiler does not support `-fdirectives-only`, older Apple Clang releases most notably, or where you force it with `:test_build` ↳ `:preprocess_force_fallback`.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 1.2.1 — 2026-10-24
|
|
48
|
+
|
|
49
|
+
Ceedling 1.2.x requires Ruby 3+ but only unofficially supports Ruby 4.
|
|
50
|
+
|
|
51
|
+
1. The new internal pipeline as of 1.0.0 that allows builds to be parallelized and configured per-test-executable can mean a fair amount of duplication of steps. A header file may be mocked identically multiple times. The same source file may be compiled identically multiple times. Delta builds (as of 1.2.0) offer considerable build time savings as do the speedup gains due to parallelization as of 1.0.0. Future releases will optimize away duplication of build steps.
|
|
52
|
+
1. An `#include` directive must resolve to a file within your project’s configured `:paths` search collection. A path that would resolve outside your configured search paths (e.g. via relative paths beyond search paths or excessive `..` parent-directory segments) is now rejected with a clear, specific error rather than silently causing a confusing downstream build failure.
|
|
53
|
+
1. With test preprocessing enabled, a test file’s `#include` of a mock whose name comes from a macro defined only in a header, as in `#include MOCK_HEADER` with `MOCK_HEADER` defined in another header, cannot be found. Define the macro under `:defines` ↳ `:test` so the test file sees it directly.
|
|
54
|
+
1. Fallback preprocessing remains a best effort with no guarantees. It is used where your toolchain’s preprocessor does not support `-fdirectives-only` or where you force it with `:test_build` ↳ `:preprocess_force_fallback`. Its handling of conditional compilation is limited and may not resolve the same branches your compiler would. Macro expansion is not supported at all.
|
|
55
|
+
1. Delta builds track the libraries a test or release links only by their `-l` and `-L` arguments, not their contents. A library rebuilt or replaced under the same name, such as one the Dependencies plugin builds, relinks nothing. Tests report results against the old library, and a release keeps it. Run `ceedling clobber` after a library changes ([#1368](https://github.com/ThrowTheSwitch/Ceedling/issues/1368)).
|
|
56
|
+
1. A test can't run when its file name, its directory below its test root, or the build root holds a space, an apostrophe, or another character the shell reads, such as `&`, `;`, `(`, or `|`. Every case reports a crash, or the build stops. Paths the cppcheck, Dependencies, and Valgrind tools name break the same way. Rename the file or directory, or quote the test fixture’s executable: `:tools` ↳ `:test_fixture` ↳ `:executable: '"${1}"'` ([#1373](https://github.com/ThrowTheSwitch/Ceedling/issues/1373)).
|
|
57
|
+
1. Paths for `TEST_SOURCE_FILE(...)` remain relative to **_project root_** — that is, from where you execute `ceedling` at the command line. If you move source files or change your directory structure, `TEST_SOURCE_FILE(...)` calls referencing moved files will need to be updated.
|
|
58
|
+
1. The `ceedling` command loads the application of the installation a project selects — through `:project` ↳ `:which_ceedling`, `WHICH_CEEDLING`, or a `vendor/ceedling/` copy — into its own process, where the two installations’ code mixes. For example, the 1.2.1 gem’s `ceedling` command fails in a project vendoring 1.2.0, and a development checkout selected this way runs partly on the gem’s code. Upgrade the Ceedling whose `ceedling` command you run, typically the gem, to 1.2.2 ([#1365](https://github.com/ThrowTheSwitch/Ceedling/issues/1365)).
|
|
59
|
+
1. A `--local` project’s `./ceedling` fails with “`vendor/ceedling/vendor/unity/test/targets` does not exist”, because vendoring leaves out Unity’s built-in mixins. Running the project with the gem’s `ceedling` command works around it.
|
|
60
|
+
1. A mocked header found below a `:paths` root such as `../**`, beside headers far outside the project, has its mock written outside the build directory, and the build stops with “Found no file … in search paths”. Give those headers’ own directories as roots instead of `..` ([#1370](https://github.com/ThrowTheSwitch/Ceedling/issues/1370)).
|
|
61
|
+
1. Same-named sources in one build can share one object, so that one replaces the other. This happens with release sources below two roots, sources below nested roots, and sources named by `:files`. Rename one of them.
|
|
62
|
+
1. `:project` ↳ `:build_root: .` lets `clobber` delete the project’s own `test/` directory. Give the build a directory of its own, such as `build`.
|
|
63
|
+
1. Where Windows Data Deduplication has optimized the gem’s files, as on a deduplicated network share holding your Ruby installation, Ruby’s `File.lstat` can report such a file as a directory. Ruby can mistake the reparse point that deduplication leaves on the file for a directory. A copy that trusts `lstat`, as Ceedling 1.2.0 and earlier did, makes a directory in `build/vendor/` where the file belongs. Ceedling 1.2.1 removes such a directory only when it stands in for `unity.c`, `cmock.c`, or `CException.c`. One standing in for any other vendored file, such as `unity.h`, fails every build. Delete `build/vendor/` and rebuild ([#1376](https://github.com/ThrowTheSwitch/Ceedling/issues/1376)).
|
|
64
|
+
1. A `-:` `:paths` entry removes only the directory it names, not the directories below it. Add a `-:` entry for each, or use a glob such as `-:src/legacy/**`.
|
|
65
|
+
1. `~` in a configured path names a directory called `~`, not your home directory. Write the full path instead.
|
|
66
|
+
1. A `:files` glob such as `+:**/*.c` collects the build directory’s own mocks, runners, and vendored Unity and CMock sources, and test files, and a release build then stops compiling them. Write the glob below your own source directories, such as `+:src/**/*.c`. A source root holding the test root also collects test files into a release build; add a `-:` `:files` entry for them.
|
|
67
|
+
|
|
68
|
+
### Partials
|
|
69
|
+
|
|
70
|
+
1. A module whose header protects itself with `#pragma once` instead of a traditional `#ifndef` include guard can still hit a `redefinition` or `conflicting types` error, if any other header your module uses reaches that header in turn. Ceedling suppresses the real header by defining its include guard, and `#pragma once` provides no guard to define. Converting the module’s header to a traditional include guard works around it.
|
|
71
|
+
1. A type created by a macro invocation rather than written out — the list and queue building macros in `sys/queue.h`, for instance — is not recognized as a type, and a Partial using one fails to compile with an `unknown type name` error.
|
|
72
|
+
1. A `struct`, `union`, or `enum` written directly on a variable, as in `static struct { int depth; } slot;`, is treated as a variable alone. The generated Partial states the type twice and fails to compile.
|
|
73
|
+
1. A `struct`, `union`, or `enum` named but not defined, as in `struct node;`, is reproduced in the generated Partial as an invalid declaration. Builds treating warnings as errors fail on it.
|
|
74
|
+
1. A macro the module retires with `#undef` is carried into the generated Partial anyway, so the name stays visible to your test file and can collide with another macro of the same name.
|
|
75
|
+
1. Exposing a module’s file-scope variables and functions removes what kept their names private to that module. Two Partialized modules in one test file that each use the same name for a file-scope variable collide at link time.
|
|
76
|
+
1. Partials cannot generate a module that text-only fallback preprocessing is unable to resolve — a module with an `#include` naming a macro, or with a type behind a conditional expression that cannot be evaluated without a real preprocessor. Ceedling stops the build and names the file and line rather than generating something subtly wrong. Fallback preprocessing is only used where your compiler does not support `-fdirectives-only`, older Apple Clang releases most notably, or where you force it with `:test_build` ↳ `:preprocess_force_fallback`.
|
|
77
|
+
|
|
78
|
+
Resolved in 1.2.2: the mixing of two installations’ code, `./ceedling` failing in a `--local` project, delta builds not relinking a changed library, most shell characters in a path stopping a test from running, and the path handling problems above: mocks written outside the build directory, same-named sources sharing an object, `clobber` emptying a project under a `.` build root, `-:` entries keeping the directories below them, and `~`. Also resolved: a directory left in `build/vendor/` for a file `lstat` misreported failing every build. The [Changelog](Changelog.md) lists every other fix since this release.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
17
82
|
## 1.2.0 — 2026-10-21
|
|
18
83
|
|
|
19
|
-
Ceedling 1.2.
|
|
84
|
+
Ceedling 1.2.x requires Ruby 3+ but only unofficially supports Ruby 4.
|
|
20
85
|
|
|
21
86
|
1. The new internal pipeline as of 1.0.0 that allows builds to be parallelized and configured per-test-executable can mean a fair amount of duplication of steps. A header file may be mocked identically multiple times. The same source file may be compiled identically multiple times. Delta builds (as of 1.2.0) offer considerable build time savings as do the speedup gains due to parallelization as of 1.0.0. Future releases will optimize away duplication of build steps.
|
|
22
|
-
1. An `#include` directive must resolve to a file within your project
|
|
87
|
+
1. An `#include` directive must resolve to a file within your project’s configured `:paths` search collection. A path that would resolve outside your configured search paths (e.g. via relative paths beyond search paths or excessive `..` parent-directory segments) is now rejected with a clear, specific error rather than silently causing a confusing downstream build failure.
|
|
23
88
|
1. With test preprocessing enabled, a test file’s `#include` of a mock whose name comes from a macro defined only in a header, as in `#include MOCK_HEADER` with `MOCK_HEADER` defined in another header, cannot be found. Define the macro under `:defines` ↳ `:test` so the test file sees it directly.
|
|
24
89
|
1. Fallback preprocessing remains a best effort with no guarantees. It is used where your toolchain’s preprocessor does not support `-fdirectives-only` or where you force it with `:test_build` ↳ `:preprocess_force_fallback`. Its handling of conditional compilation is limited and may not resolve the same branches your compiler would. Macro expansion is not supported at all.
|
|
90
|
+
1. Delta builds track the libraries a test or release links only by their `-l` and `-L` arguments, not their contents. A library rebuilt or replaced under the same name, such as one the Dependencies plugin builds, relinks nothing. Tests report results against the old library, and a release keeps it. Run `ceedling clobber` after a library changes ([#1368](https://github.com/ThrowTheSwitch/Ceedling/issues/1368)).
|
|
91
|
+
1. A test can't run when its file name, its directory below its test root, or the build root holds a space, an apostrophe, or another character the shell reads, such as `&`, `;`, `(`, or `|`. Every case reports a crash, or the build stops. Paths the cppcheck, Dependencies, and Valgrind tools name break the same way. Rename the file or directory, or quote the test fixture’s executable: `:tools` ↳ `:test_fixture` ↳ `:executable: '"${1}"'` ([#1373](https://github.com/ThrowTheSwitch/Ceedling/issues/1373)).
|
|
25
92
|
1. Paths for `TEST_SOURCE_FILE(...)` remain relative to **_project root_** — that is, from where you execute `ceedling` at the command line. If you move source files or change your directory structure, `TEST_SOURCE_FILE(...)` calls referencing moved files will need to be updated.
|
|
93
|
+
1. The `ceedling` command loads the application of the installation a project selects — through `:project` ↳ `:which_ceedling`, `WHICH_CEEDLING`, or a `vendor/ceedling/` copy — into its own process, where the two installations’ code mixes. For example, the 1.2.1 gem’s `ceedling` command fails in a project vendoring 1.2.0, and a development checkout selected this way runs partly on the gem’s code. Upgrade the Ceedling whose `ceedling` command you run, typically the gem, to 1.2.2 ([#1365](https://github.com/ThrowTheSwitch/Ceedling/issues/1365)).
|
|
94
|
+
1. A `--local` project’s `./ceedling` fails with “`vendor/ceedling/vendor/unity/test/targets` does not exist”, because vendoring leaves out Unity’s built-in mixins. Running the project with the gem’s `ceedling` command works around it.
|
|
95
|
+
1. A mocked header found below a `:paths` root such as `../**`, beside headers far outside the project, has its mock written outside the build directory, and the build stops with “Found no file … in search paths”. Give those headers’ own directories as roots instead of `..` ([#1370](https://github.com/ThrowTheSwitch/Ceedling/issues/1370)).
|
|
96
|
+
1. Same-named sources in one build can share one object, so that one replaces the other. This happens with release sources below two roots, sources below nested roots, and sources named by `:files`. Rename one of them.
|
|
97
|
+
1. `:project` ↳ `:build_root: .` lets `clobber` delete the project’s own `test/` directory. Give the build a directory of its own, such as `build`.
|
|
98
|
+
1. Where Windows Data Deduplication has optimized the gem’s files, as on a deduplicated network share holding your Ruby installation, Ruby’s `File.lstat` can report such a file as a directory. Ruby can mistake the reparse point that deduplication leaves on the file for a directory. Ceedling copies Unity, CMock, and CException into the build directory with Ruby’s `FileUtils.cp_r`, which classifies each entry with `lstat`. Told that a file is a directory, `cp_r` makes a directory of that name in `build/vendor/` and fails reading the file as one, and every later build fails on that directory. Install Ruby and the gem on a local drive, or exclude them from deduplication ([#1376](https://github.com/ThrowTheSwitch/Ceedling/issues/1376)).
|
|
99
|
+
1. A `-:` `:paths` entry removes only the directory it names, not the directories below it. Add a `-:` entry for each, or use a glob such as `-:src/legacy/**`.
|
|
100
|
+
1. `~` in a configured path names a directory called `~`, not your home directory. Write the full path instead.
|
|
101
|
+
1. A `:files` glob such as `+:**/*.c` collects the build directory’s own mocks, runners, and vendored Unity and CMock sources, and test files, and a release build then stops compiling them. Write the glob below your own source directories, such as `+:src/**/*.c`. A source root holding the test root also collects test files into a release build; add a `-:` `:files` entry for them.
|
|
26
102
|
|
|
27
103
|
### Partials
|
|
28
104
|
|
|
@@ -34,17 +110,26 @@ Ceedling 1.2.0 requires Ruby 3+ but only unoficially supports Ruby 4.
|
|
|
34
110
|
1. Exposing a module’s file-scope variables and functions removes what kept their names private to that module. Two Partialized modules in one test file that each use the same name for a file-scope variable collide at link time.
|
|
35
111
|
1. Partials cannot generate a module that text-only fallback preprocessing is unable to resolve — a module with an `#include` naming a macro, or with a type behind a conditional expression that cannot be evaluated without a real preprocessor. Ceedling stops the build and names the file and line rather than generating something subtly wrong. Fallback preprocessing is only used where your compiler does not support `-fdirectives-only`, older Apple Clang releases most notably, or where you force it with `:test_build` ↳ `:preprocess_force_fallback`.
|
|
36
112
|
|
|
113
|
+
Resolved in 1.2.2: the mixing of two installations’ code, `./ceedling` failing in a `--local` project, delta builds not relinking a changed library, most shell characters in a path stopping a test from running, and the path handling problems above: mocks written outside the build directory, same-named sources sharing an object, `clobber` emptying a project under a `.` build root, `-:` entries keeping the directories below them, and `~`. Also resolved: frameworks vendor copying failing on files `lstat` misreports as directories. The [Changelog](Changelog.md) lists every other fix since this release.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
37
117
|
## 1.1.x — 2026-07-16
|
|
38
118
|
|
|
119
|
+
Covers 1.1.0 through 1.1.10 as known by 1.1.10. An item may not apply to every patch release.
|
|
120
|
+
|
|
39
121
|
1. The new internal pipeline as of 1.0.0 that allows builds to be parallelized and configured per-test-executable can mean a fair amount of duplication of steps. A header file may be mocked identically multiple times. The same source file may be compiled identically multiple times. The speed gains due to parallelization help make up for this. Future releases will concentrate on optimizing away duplication of build steps.
|
|
40
122
|
1. While header file search paths are now customizable per executable, this currently only applies to the search paths the compiler uses. Distinguishing test files or header files of the same name in different directories for test runner and mock generation respectively continues to rely on educated guesses in Ceedling code.
|
|
41
123
|
1. All header files needed for test compilation must be within the `:includes` path collection. Relative paths in include directives that extend outside the path collection will cause build problems.
|
|
42
124
|
1. Any path for a C file specified with `TEST_SOURCE_FILE(...)` is in relation to **_project root_** — that is, from where you execute `ceedling` at the command line. If you move source files or change your directory structure, many of your `TEST_SOURCE_FILE(...)` calls may need to be updated. A more flexible and dynamic approach to path handling will come in a future update.
|
|
43
125
|
1. In certain combinations of conditional preprocessing blocks with dependent symbols defined in another file, Ceedling can silently fail to extract computed includes (e.g. `#include SOME_MACRO()`).
|
|
44
|
-
1. The automatic vendor copying of Unity, CMock, and CException into a project
|
|
126
|
+
1. The automatic vendor copying of Unity, CMock, and CException into a project’s build directory can intermittently fail with a file/directory type error, most often under antivirus/EDR file locking, cloud-sync filter drivers, or two concurrent Ceedling invocations racing the same destination. Deleting `build/` (or reinstalling the gem) and rebuilding works around it.
|
|
45
127
|
1. The Bullseye code coverage plugin has been temporarily disabled as of 1.0.0. The makers of Bullseye have generously provided a license for development, and the plugin will be available in 1.2.0.
|
|
46
128
|
1. On Windows, a test file whose name contains _install_, _setup_, _update_, or _patch_ can build a test executable that the Installer Detection feature of User Account Control (UAC) will not run without administrator privileges. Toolchains that embed a manifest requesting the invoker’s privileges, such as MSYS2’s MinGW-w64 GCC with its default manifest installed, avoid this. Otherwise, avoid these words in test filenames.
|
|
47
|
-
1.
|
|
129
|
+
1. A test can't run when its file name or the build root holds a space, an apostrophe, or another character the shell reads, such as `&`, `;`, `(`, or `|`. Every case reports a crash, or the build stops. Paths the cppcheck, Dependencies, and Valgrind tools name break the same way. Rename the file, or quote the test fixture’s executable: `:tools` ↳ `:test_fixture` ↳ `:executable: '"${1}"'` ([#1373](https://github.com/ThrowTheSwitch/Ceedling/issues/1373)).
|
|
130
|
+
1. A release isn't relinked when only a library it links changes, since it depends only on its objects. Test builds relink every time. Run `ceedling clobber` after a library changes ([#1368](https://github.com/ThrowTheSwitch/Ceedling/issues/1368)).
|
|
131
|
+
1. A `--local` project’s `./ceedling` fails with “`vendor/ceedling/vendor/unity/test/targets` does not exist”, because vendoring leaves out Unity’s built-in mixins. Running the project with the gem’s `ceedling` command works around it.
|
|
132
|
+
1. Ceedling depends on the `erb` gem. Published `erb` versions include those affected by CVE-2026-41316, a flaw in how ERB reconstructs a template object from serialized data. Ceedling never reconstructs a template object this way, so Ceedling itself is not exposed. Dependency and security scanners may still flag the `erb` gem because the dependency is present. The `erb` dependency will be removed entirely as of 1.2.0 for multiple reasons beyond eliminating any false positive flags of the security issue.
|
|
48
133
|
|
|
49
134
|
### Partials
|
|
50
135
|
|
|
@@ -72,3 +157,4 @@ Ceedling 1.2.0 requires Ruby 3+ but only unoficially supports Ruby 4.
|
|
|
72
157
|
1. Ceedling’s many test preprocessing improvements are not presently able to preserve Unity’s special `TEST_CASE()` and `TEST_RANGE()` features. However, preprocessing of test files is much less frequently needed than preprocessing of mockable header files. Test preprocessing can now be configured to enable only one or the other. As such, these advanced Unity features can still be used in even sophisticated projects.
|
|
73
158
|
1. The Bullseye code coverage plugin has been temporarily disabled until a license can be procured that will allow updates and improvements.
|
|
74
159
|
1. On Windows, a test file whose name contains _install_, _setup_, _update_, or _patch_ can build a test executable that the Installer Detection feature of User Account Control (UAC) will not run without administrator privileges. Toolchains that embed a manifest requesting the invoker’s privileges, such as MSYS2’s MinGW-w64 GCC with its default manifest installed, avoid this. Otherwise, avoid these words in test filenames.
|
|
160
|
+
1. A test can't run when its file name or the build root holds a space, an apostrophe, or another character the shell reads, such as `&`, `;`, `(`, or `|`. Every case reports a crash, or the build stops. Paths the Dependencies plugin’s tools name break the same way. Rename the file, or quote the test fixture’s executable: `:tools` ↳ `:test_fixture` ↳ `:executable: '"${1}"'` ([#1373](https://github.com/ThrowTheSwitch/Ceedling/issues/1373)).
|
data/docs/ReleaseNotes.md
CHANGED
|
@@ -8,6 +8,19 @@ These release notes are complemented by three other documents:
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
# 1.2.2 — October 31, 2026
|
|
12
|
+
|
|
13
|
+
## ⚠️ Breaking changes in a patch release
|
|
14
|
+
|
|
15
|
+
1.2.2 is a patch release, yet [Breaking Changes](BreakingChanges.md) lists several entries for 1.2.2. Each entry is a bug fix that changes a behavior that a project might rely on and is, therefore, technically a breaking change. Despite this, we decided to maintain 1.2.2 as only a patch version for a few reasons:
|
|
16
|
+
|
|
17
|
+
1. **Core builds are unaffected.** A correctly configured project builds and tests as before. The first test build after upgrading rebuilds everything once via a full delta build because of changes to how ephemeral build directory output is organized.
|
|
18
|
+
1. **Plugin changes are limited to artifact paths.** Plugins that write per-test logs and reports, such as Valgrind, Sanitize, and Raw Output Log, write them to new paths because of build directory output fixes (see [1]). In a Ceedling build, every plugin is optional, and these changes do not impact test suites or release builds.
|
|
19
|
+
1. **The fixes resolve latent bugs.** Nobody reported these bugs and some persisted across several versions: complete diambiguation of same-named tests, `TEST_SOURCE_FILE()` checking, [Which Ceedling](https://docs.throwtheswitch.org/Ceedling/1.2.0/configuration/which-ceedling/), CLI `--local` vendoring, `ceedling upgrade`, and `ceedling version`. With the fixes, these features now do what they were meant to do.
|
|
20
|
+
1. **Path configuration changes reach only unusual layouts.** A `-:` `:paths` entry now also removes the directories below the one it names. A build root that is the project directory or a directory above it is now refused, because `clobber` could delete the project’s own files. A `:paths` or `:files` entry within the build root now logs a warning, and no entry collects from the directories Ceedling creates there. See [Breaking Changes](BreakingChanges.md).
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
11
24
|
# 1.2.0 — October 21, 2026
|
|
12
25
|
|
|
13
26
|
## 👀 Highlights
|
data/docs/overrides/main.html
CHANGED
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
Material's own `outdated`/`announce` blocks (base.html) ship empty by
|
|
5
5
|
default -- both are opt-in via a project template override like this one.
|
|
6
6
|
|
|
7
|
+
Material only renders a block's wrapping banner markup when the block
|
|
8
|
+
produces non-empty output, and whitespace alone counts as output. The
|
|
9
|
+
`{%- -%}` whitespace control below is load-bearing: without it the
|
|
10
|
+
indentation around each `if` leaks out, rendering an empty banner (a blank
|
|
11
|
+
dark bar for `announce`) even when the condition is false.
|
|
12
|
+
|
|
7
13
|
`outdated`: the standard "you're not viewing the latest version" warning
|
|
8
|
-
banner
|
|
9
|
-
produces non-empty output, so suppressing it here for prerelease pages
|
|
10
|
-
(rather than just leaving the block's *content* blank) is what keeps the
|
|
11
|
-
banner from appearing at all on those pages.
|
|
14
|
+
banner, suppressed entirely on prerelease pages.
|
|
12
15
|
|
|
13
16
|
`announce`: a separate announcement bar, used here to carry the prerelease
|
|
14
17
|
notice instead. `extra.prerelease` is set to `true` only in
|
|
@@ -17,16 +20,16 @@
|
|
|
17
20
|
#}
|
|
18
21
|
|
|
19
22
|
{% block outdated %}
|
|
20
|
-
{
|
|
23
|
+
{%- if not config.extra.prerelease -%}
|
|
21
24
|
You are not viewing the latest version.
|
|
22
25
|
<a href="{{ '../' ~ base_url }}">
|
|
23
26
|
<strong>Click here to go to latest.</strong>
|
|
24
27
|
</a>
|
|
25
|
-
{
|
|
28
|
+
{%- endif -%}
|
|
26
29
|
{% endblock %}
|
|
27
30
|
|
|
28
31
|
{% block announce %}
|
|
29
|
-
{
|
|
32
|
+
{%- if config.extra.prerelease -%}
|
|
30
33
|
This is prerelease documentation for an upcoming Ceedling release.
|
|
31
|
-
{
|
|
34
|
+
{%- endif -%}
|
|
32
35
|
{% endblock %}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
# Writes logs that hold only the current build's entries, such as gdb crash backtraces and
|
|
9
|
+
# sanitizer findings. A build's first write to a log replaces whatever an earlier build left
|
|
10
|
+
# there, and its later writes append. Build threads share one writer, so deciding first or
|
|
11
|
+
# later and writing happen together under one lock, and an append never lands before the
|
|
12
|
+
# write that replaces the file.
|
|
13
|
+
class BuildLogWriter
|
|
14
|
+
|
|
15
|
+
constructor :file_wrapper
|
|
16
|
+
|
|
17
|
+
def setup
|
|
18
|
+
@written = []
|
|
19
|
+
@mutex = Mutex.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# `separator` goes between entries appended to one log
|
|
23
|
+
def write(filepath, text, separator: '')
|
|
24
|
+
@mutex.synchronize do
|
|
25
|
+
first = !@written.include?( filepath )
|
|
26
|
+
@written << filepath if first
|
|
27
|
+
|
|
28
|
+
@file_wrapper.mkdir_for( filepath )
|
|
29
|
+
@file_wrapper.write( filepath, first ? text : separator + text, first ? 'w' : 'a' )
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
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 'ceedling/filesystem/file_path_utils'
|
|
9
|
+
require 'ceedling/filesystem/project_paths'
|
|
10
|
+
|
|
11
|
+
# What a build root may be, and what in it a build may collect. Clobber empties the
|
|
12
|
+
# directories Ceedling creates in the build root, so the build root names a directory,
|
|
13
|
+
# neither the project directory nor one above it. Collection leaves out the directories
|
|
14
|
+
# Ceedling creates, and a :paths or :files entry within the build root is warned of.
|
|
15
|
+
module BuildRootPolicy
|
|
16
|
+
|
|
17
|
+
# The settings naming the directories Ceedling creates, in the build root or, for mocks,
|
|
18
|
+
# wherever the mock path places them
|
|
19
|
+
CREATED = %i[
|
|
20
|
+
project_build_artifacts_root project_build_tests_root project_build_release_root project_build_vendor_root
|
|
21
|
+
project_build_dependencies_cache_path project_log_path cmock_mock_path
|
|
22
|
+
].freeze
|
|
23
|
+
|
|
24
|
+
# Why `root` is no build root, or nil when it is one. Compared as the places really are,
|
|
25
|
+
# so no symlinked spelling of the project gets by.
|
|
26
|
+
def self.problem(root)
|
|
27
|
+
return 'names no directory' if root.strip.empty?
|
|
28
|
+
return 'is the project directory or holds it' if ProjectPaths.contains?( ProjectPaths.canonical( root ), ProjectPaths.working_dir )
|
|
29
|
+
|
|
30
|
+
return nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# The message refusing `root` for `problem`
|
|
34
|
+
def self.message(root, problem)
|
|
35
|
+
return ":project ↳ :build_root => '#{root}' #{problem}. Give the build its own directory, such as 'build'."
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Each :paths and :files entry that adds to a build from within `root`, as
|
|
39
|
+
# [section, key, entry]
|
|
40
|
+
def self.entries_within(root, config)
|
|
41
|
+
real = ProjectPaths.canonical( root )
|
|
42
|
+
return additive_entries( config ).select { |_, _, entry| ProjectPaths.contains?( real, ProjectPaths.canonical( FilePathUtils.no_decorators( entry ) ) ) }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# A warning of each :paths and :files entry that adds to a build from within `root`, its
|
|
46
|
+
# place in the configuration spelled by the block
|
|
47
|
+
def self.warnings(root, config)
|
|
48
|
+
return entries_within( root, config ).map do |section, key, entry|
|
|
49
|
+
"#{yield( [section, key] )} => '#{entry}' lies in the build root '#{root}'. Ceedling leaves out the directories it creates there."
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# The directories Ceedling creates, each enabled plugin's build directory among them, from
|
|
54
|
+
# a flattened configuration. A setting with no path names none.
|
|
55
|
+
def self.reserved(config)
|
|
56
|
+
root = config[:project_build_root].to_s
|
|
57
|
+
plugins = root.empty? ? [] : (config[:plugins_enabled] || []).map { |plugin| File.join( root, File.basename( plugin.to_s ) ) }
|
|
58
|
+
return (CREATED.map { |key| config[key].to_s } + plugins).reject( &:empty? ).uniq
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Every :paths and :files entry that adds to a build, as [section, key, entry]
|
|
62
|
+
def self.additive_entries(config)
|
|
63
|
+
entries = [:paths, :files].flat_map do |section|
|
|
64
|
+
(config[section] || {}).flat_map { |key, list| Array( list ).flatten.map { |entry| [section, key, entry] } }
|
|
65
|
+
end
|
|
66
|
+
return entries.select { |_, _, entry| entry.is_a?( String ) and FilePathUtils.add_path?( entry ) }
|
|
67
|
+
end
|
|
68
|
+
private_class_method :additive_entries
|
|
69
|
+
|
|
70
|
+
end
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
require 'ceedling/defaults'
|
|
9
9
|
require 'ceedling/constants'
|
|
10
|
-
require 'ceedling/file_path_utils'
|
|
10
|
+
require 'ceedling/filesystem/file_path_utils'
|
|
11
11
|
require 'ceedling/exceptions'
|
|
12
12
|
require 'ceedling/rake_app/rakefile_component_resolver'
|
|
13
13
|
require 'ceedling/tool_executor'
|
|
@@ -16,7 +16,8 @@ require 'deep_merge'
|
|
|
16
16
|
class Configurator
|
|
17
17
|
|
|
18
18
|
attr_reader :project_config_hash, :programmatic_plugins, :rake_plugins
|
|
19
|
-
attr_accessor :project_logging, :sanity_checks, :include_test_case, :exclude_test_case, :force_test_rerun
|
|
19
|
+
attr_accessor :project_logging, :sanity_checks, :include_test_case, :exclude_test_case, :force_test_rerun,
|
|
20
|
+
:test_build_tasks, :release_build_tasks
|
|
20
21
|
|
|
21
22
|
constructor :configurator_setup, :configurator_builder, :configurator_plugins, :config_walkinator, :yaml_wrapper, :system_wrapper, :loginator, :reportinator, :ruby_expandinator
|
|
22
23
|
|
|
@@ -26,7 +27,7 @@ class Configurator
|
|
|
26
27
|
|
|
27
28
|
# Validations of the completed configuration
|
|
28
29
|
FINAL_VALIDATIONS = [
|
|
29
|
-
:validate_paths, :validate_tools, :validate_defines, :validate_flags, :validate_line_markers,
|
|
30
|
+
:validate_build_root, :validate_paths, :validate_tools, :validate_defines, :validate_flags, :validate_line_markers,
|
|
30
31
|
:validate_test_preprocessor, :validate_backtrace, :validate_threads, :validate_partials, :validate_plugins
|
|
31
32
|
].freeze
|
|
32
33
|
|
|
@@ -150,18 +151,11 @@ class Configurator
|
|
|
150
151
|
|
|
151
152
|
|
|
152
153
|
def prepare_plugins_load_paths(plugins_load_path, config)
|
|
153
|
-
# Plugins must be loaded before generic path evaluation & magic that happen later
|
|
154
|
-
#
|
|
155
|
-
#
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
FilePathUtils::standardize_in_place( path )
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
# Delegate list construction to the shared helper (user paths first, built-in last).
|
|
162
|
-
# This mirrors what RakefileComponentResolver.resolve() does in the bin/ CLI scope,
|
|
163
|
-
# ensuring both scopes search plugins in the same priority order.
|
|
164
|
-
config[:plugins][:load_paths] = RakefileComponentResolver.prepare_plugin_load_paths( config, plugins_load_path )
|
|
154
|
+
# Plugins must be loaded before generic path evaluation & magic that happen later, so
|
|
155
|
+
# their load paths are expanded and standardized here, by the helper bin/ shares (user
|
|
156
|
+
# paths first, built-in last), so both scopes search plugins alike.
|
|
157
|
+
expand = ->(path) { @ruby_expandinator.expand( path, source: ":plugins ↳ :load_paths" ) }
|
|
158
|
+
config[:plugins][:load_paths] = RakefileComponentResolver.prepare_plugin_load_paths( config, plugins_load_path, expand: expand )
|
|
165
159
|
|
|
166
160
|
return @configurator_plugins.process_aux_load_paths( config )
|
|
167
161
|
end
|
|
@@ -232,6 +226,13 @@ class Configurator
|
|
|
232
226
|
end
|
|
233
227
|
|
|
234
228
|
|
|
229
|
+
# Each Unity helper's header is included in every mock by its filename, so this follows
|
|
230
|
+
# path standardizing, which a helper written with backslashes needs to have a filename
|
|
231
|
+
def populate_cmock_helpers(config)
|
|
232
|
+
include_unity_helpers( config[:cmock] ) if config[:project][:use_mocks]
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
|
|
235
236
|
def populate_test_runner_generation_config(config)
|
|
236
237
|
progress( 'Populating test runner generation settings' )
|
|
237
238
|
|
|
@@ -431,7 +432,9 @@ class Configurator
|
|
|
431
432
|
@configurator_setup.build_directory_structure( flattened_config )
|
|
432
433
|
|
|
433
434
|
# Copy Unity, CMock, CException into vendor directory within build directory
|
|
434
|
-
@configurator_setup.vendor_frameworks_and_support_files(
|
|
435
|
+
@configurator_setup.vendor_frameworks_and_support_files(
|
|
436
|
+
ceedling_lib_path, flattened_config, test_build: @test_build_tasks == true, release_build: @release_build_tasks == true
|
|
437
|
+
)
|
|
435
438
|
@configurator_setup.build_project_collections( flattened_config )
|
|
436
439
|
|
|
437
440
|
@project_config_hash = flattened_config.clone
|
|
@@ -570,8 +573,6 @@ class Configurator
|
|
|
570
573
|
# Plugins housekeeping
|
|
571
574
|
cmock[:plugins].map! { |plugin| plugin.to_sym() }.uniq!
|
|
572
575
|
|
|
573
|
-
include_unity_helpers( cmock )
|
|
574
|
-
|
|
575
576
|
# Add mocking prefix symbol for all test compilation
|
|
576
577
|
cmock[:defines] << "CMOCK_MOCK_PREFIX=#{cmock[:mock_prefix]}"
|
|
577
578
|
end
|