Repository navigation
💪 Fixed
- Fixed the Valgrind plugin writing no report, and reporting a crash, for any test below its test root. The Raw Output Log plugin failed to write such a test’s log.
- Fixed
:use_backtrace: :gdblogs 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. - Fixed TeamCity plugin naming the suites of same-named tests alike. A suite is now named by its test’s path, and escaped as TeamCity requires.
- #1369 Fixed TeamCity 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. - Fixed checking of
TEST_SOURCE_FILE()entries:- Each test now checks only its own entries, removing unnecessarily duplicated checks yielding a test build speedup.
- 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:noneor:mocksthe entry went unchecked (see Breaking Changes). - An entry using
..is no longer rejected with test preprocessing on.
- A “Multiple files matched” notice now prints once a build, not once for every lookup that makes the same choice.
- Fixed a delta build 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. - #1365 Fixed a project that selects another Ceedling installation — through
:project↳:which_ceedling,WHICH_CEEDLING, or avendor/ceedling/copy — running on a mix of both installations’ code. Across versions it failed outright: a 1.2.1ceedlingcould 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). - Fixed
ceedling versionreporting the launcher’s version number for the application and ignoring a project’s:which_ceedling. It now reads your project file and takes--projectand--mixin. - Fixed
ceedling new,ceedling example, andceedling examplesrunning the launcher’s code with the installationWHICH_CEEDLINGselects, andnewrecording the launcher’s version in:ceedling_version:.docsignored 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--localcopy does not. - Fixed
ceedling upgraderun inside a--localproject deleting the project’s vendored Ceedling and then failing to copy from it (see Breaking Changes). - #1371 Fixed
ceedling upgradenever refreshing documentation thatnew --docsorexample --docsexported since 1.1.0. It now replaces only what the export wrote, and leaves your own files indocs/. Previously, a project exported by 1.0.x lost all ofdocs/. - Fixed a
--localproject’s./ceedlingfailing since 1.1.0 with “vendor/ceedling/vendor/unity/test/targetsdoes not exist”. Vendoring now copies Unity’s built-in mixins. Re-vendor an existing project withceedling upgrade. - Fixed the
./ceedlinglaunch script splitting arguments that contain spaces, such as--test-case="adds two"or an inline YAML--mixin. - Fixed backslashes in a
WHICH_CEEDLINGor:which_ceedlingpath going unconverted. - #1366 Fixed the gcov plugin 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_decisionalso checks condition coverage, which:mcdcproduces. - #1368 Fixed a delta build not relinking a test or release when a library it links changes. A link now depends on the library files its
:librariesentries name on:paths↳:libraries, and on the libraries the Dependencies plugin builds. - Fixed a Unity helper 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.
- #1377 Fixed the FFF plugin leaving out the headers that
:cmock↳:includes_c_pre_header,:includes_c_post_header, and:includes_h_pre_orig_headername, 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 is now included in a fake’s source, as in a mock’s. - Fixed the Dependencies plugin placing an absolute artifact or include path below its
:artifactpath, and:build_libwriting its list files into the working directory.
Path handling
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.
- #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, andexamplelist what they copy the same way. This is best effort, since Ceedling cannot vouch for every filesystem (see Known 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.cbesidetest/unit/test_calc.c. It stoppedtest:all, a test named by its full path, and plugin builds such asgcov:all. Each test is now properly named by its path from the project root, and its build finds its own source by that name. - Fixed two test files sharing one build name, so that one silently replaced the other: tests under overlapping
:paths↳:testroots (e.g.test/**andtest/unit/**), the same layout under two roots, or a:files↳:testtest outside every root. Since 1.2.0, the error above hid it. - Fixed a directory of tests named like a test beside it, such as
test/test_foo/besidetest/test_foo.c, making a mock both tests use ambiguous. - #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.
- #1370 Fixed mocking a header found below a
:pathsroot such as../**beside headers far outside the project, such asC:/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. - 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.candlib/foo.c), sources below nested roots (src/util.candsrc/legacy/util.c), sources named by:files, gcov and Bullseye untested sources, and sources the Dependencies plugin’s:build_libcompiles. 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. - Fixed a
:pathsentry written as./src/**, as an absolute path, or through a symlink not matching the same directories written assrc/**. A header below such a root missed the source beside it, and its mock missed its directory. - Fixed a
:pathsroot such as../**or./**collecting the build directory’s own generated mocks, runners, and objects. - Fixed a
:filesglob such as+:**/*.ccollecting the build directory’s own mocks, runners, and vendored Unity and CMock sources, which stopped a release build. A:filesglob now adds nothing from the build directory. - Fixed a
:filesglob such as+:**/*.c, or a source root holding the test root, collecting test files into a release build, which then stopped compiling them. A:filesrevision also no longer adds a test file to the source collection. - Fixed a
-::pathsentry 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. - Fixed
:project↳:build_root: .lettingclobberdelete the project’s owntest/directory. Such a build root is now refused (see Breaking Changes). - Fixed
~in a configured path naming a directory called~. It now names your home directory in:paths,:files,:project↳:build_root, every*_pathsetting, tool executables, mixins,--project,--logfile,:which_ceedling,WHICH_CEEDLING, plugin load paths, and the Dependencies plugin’s paths. - Fixed
-Llinker arguments repeating:paths↳:librariesentries as written, decorators and globs included (see Changed). - Fixed a
TEST_INCLUDE_PATH()written differently from its:pathsentry, such as with./, ranking its headers last among same-named candidates. - Fixed
test:tasks naming a test with./or a leading.., such asceedling test:../tests/test_x. - Fixed mocks failing to compile in three cases: a mock whose
#includefolder shares the test file’s name, two same-named mocks told apart only by their#includefolders, and a mock#includespelling more path than its header’s directory with:cmock↳:mock_name_include_folderdisabled. - Fixed an absolute
:release_build↳:outputplaced below the release build directory. It now names the release itself, with its map file beside it. - Fixed the log directory and plugin load paths ignoring inline Ruby string expansion and backslashes when read before configuration loads.
- Fixed a test in a project directory named
_up_or_abs_sharing a build name with a test outside the project.
⚠️ Changed
- Each test’s build output, results, and logs now sit beneath its path from the project root.
test/unit/test_calc.c, onceunit/test_calc, is nowtest/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. Runceedling clobberto remove the output left in the old layout, which coverage reports would otherwise still read. See Breaking Changes. - A command that selects another Ceedling installation now runs in that installation’s own process, handed off by the
ceedlingcommand you run. Both sides log a notice naming both versions. Every command exceptversionhands off this way, adding about 0.2 seconds. See Which Ceedling and Breaking Changes. - A 1.2.2 application loaded by an older launcher into its own process warns and restarts in its own process.
- 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.cbuilds tobuild/test/out/test/test_uart/src/drivers/uart.o, and a release builds it tobuild/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. - A
-::pathsentry now removes the directory it names and every directory below it, unless an additive entry names one of them more closely, as+:src/legacy/keepdoes beside-:src/legacy. See Breaking Changes. - A
:pathsor:filesentry within the build root now logs a warning, and no entry collects from the directories Ceedling and its plugins create, such asbuild/test/orbuild/vendor/. See Breaking Changes. -Llinker arguments now name the directories:paths↳:librariesentries collect, as any:pathsentry does. An entry that collects no existing directory adds no-Largument.- 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.
ceedling new --local,upgrade, andexamplenow copy the contents of a linked directory within a Ceedling installation, and stop on a link loop.- 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). Plugin development currently makes no guarantees as to the location of internal Ceedling resources.