<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3/.github/workflows/linux-builds.yml, branch feature/per-test-coverage</title>
<subtitle>Progmasoft Catch3: an independently maintained C++17 test framework with a parallel runner, property checks, snapshots and structured results.</subtitle>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/'/>
<entry>
<title>Keep per-test coverage with --coverage (roadmap step 4)</title>
<updated>2026-11-13T04:46:08+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-13T04:46:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=17248837a78462596809f902dd47cf113a39670b'/>
<id>17248837a78462596809f902dd47cf113a39670b</id>
<content type='text'>
--coverage=DIR runs every attempt in a process of its own and keeps the
coverage of each test, for binaries built with LLVM source-based
coverage (Clang: -fprofile-instr-generate -fcoverage-mapping) or gcov
(GCC: --coverage).

How it works:

- The scheduler gives each attempt a fresh worker, as --isolate does,
  and sets LLVM_PROFILE_FILE and GCOV_PREFIX for it: the profile the
  process writes at exit is then the coverage of that one test, in
  DIR/profiles/t&lt;index&gt;-a&lt;attempt&gt;.profraw or a .gcov directory. Each
  runtime reads its own variable, so no symbol of either runtime is
  looked up: weak references would not pull them out of their static
  archives, and Mach-O does not allow undefined weak symbols.
- A process that runs other tests first (bisection) writes beside the
  profiles, never into one. The attempt records its profile, also in
  the JSON results.
- The profiles of an earlier run are removed when the run starts,
  because gcov adds to the .gcda files it finds.
- After the run, CoverageReport reads the last profile of every test:
  llvm-profdata and llvm-cov (PATH, xcrun on macOS, or
  CATCH3_LLVM_PROFDATA / CATCH3_LLVM_COV) export LCOV, gcov (or
  CATCH3_GCOV) writes JSON next to a copy of the .gcno. The result is
  DIR/coverage.json, the files, lines and branches each test reached,
  and DIR/coverage.lcov for the whole run. Without the tools the
  profiles stay and the run says so.
- --coverage with --in-process or --break is refused.

Tests: option parsing, LCOV reading and writing, gcov JSON, and an
integration test on CoverageFixture, a binary CMake builds with the
coverage flags of Clang or GCC: two tests reach different lines, each
map holds only its own, the LCOV report holds both, and a stale profile
of an earlier run is gone. Locally all 84 CTest tests pass with Clang,
and the coverage tests pass with GCC (built with
CATCH3_ENABLE_WERROR=OFF: Catch3 does not build with GCC's warnings as
errors, before and after this change).

CI: the Linux jobs install LLVM's coverage tools, a new job checks the
gcov path with GCC, and CATCH3_COVERAGE_REQUIRE_MAP turns a missing map
into a failure on Linux and macOS instead of a skip. MSVC has no
source-based coverage, so its builds skip those tests; the roadmap
lists step 4 as in progress until Windows with clang-cl is tested.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
--coverage=DIR runs every attempt in a process of its own and keeps the
coverage of each test, for binaries built with LLVM source-based
coverage (Clang: -fprofile-instr-generate -fcoverage-mapping) or gcov
(GCC: --coverage).

How it works:

- The scheduler gives each attempt a fresh worker, as --isolate does,
  and sets LLVM_PROFILE_FILE and GCOV_PREFIX for it: the profile the
  process writes at exit is then the coverage of that one test, in
  DIR/profiles/t&lt;index&gt;-a&lt;attempt&gt;.profraw or a .gcov directory. Each
  runtime reads its own variable, so no symbol of either runtime is
  looked up: weak references would not pull them out of their static
  archives, and Mach-O does not allow undefined weak symbols.
- A process that runs other tests first (bisection) writes beside the
  profiles, never into one. The attempt records its profile, also in
  the JSON results.
- The profiles of an earlier run are removed when the run starts,
  because gcov adds to the .gcda files it finds.
- After the run, CoverageReport reads the last profile of every test:
  llvm-profdata and llvm-cov (PATH, xcrun on macOS, or
  CATCH3_LLVM_PROFDATA / CATCH3_LLVM_COV) export LCOV, gcov (or
  CATCH3_GCOV) writes JSON next to a copy of the .gcno. The result is
  DIR/coverage.json, the files, lines and branches each test reached,
  and DIR/coverage.lcov for the whole run. Without the tools the
  profiles stay and the run says so.
- --coverage with --in-process or --break is refused.

Tests: option parsing, LCOV reading and writing, gcov JSON, and an
integration test on CoverageFixture, a binary CMake builds with the
coverage flags of Clang or GCC: two tests reach different lines, each
map holds only its own, the LCOV report holds both, and a stale profile
of an earlier run is gone. Locally all 84 CTest tests pass with Clang,
and the coverage tests pass with GCC (built with
CATCH3_ENABLE_WERROR=OFF: Catch3 does not build with GCC's warnings as
errors, before and after this change).

CI: the Linux jobs install LLVM's coverage tools, a new job checks the
gcov path with GCC, and CATCH3_COVERAGE_REQUIRE_MAP turns a missing map
into a failure on Linux and macOS instead of a skip. MSVC has no
source-based coverage, so its builds skip those tests; the roadmap
lists step 4 as in progress until Windows with clang-cl is tested.
</pre>
</div>
</content>
</entry>
<entry>
<title>Install again with CMake</title>
<updated>2026-11-01T18:46:59+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-01T18:46:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=a371b0ff18fd18819e0624fcb9a8ad3d94f4ef25'/>
<id>a371b0ff18fd18819e0624fcb9a8ad3d94f4ef25</id>
<content type='text'>
cmake --install failed on extras/ParseAndAddCatchTests.cmake, which the
rename to Catch3 removed while CMakeLists.txt kept listing it. No job ran
an install, so nothing showed it. The Linux job now installs the library
and finds the installed package.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
cmake --install failed on extras/ParseAndAddCatchTests.cmake, which the
rename to Catch3 removed while CMakeLists.txt kept listing it. No job ran
an install, so nothing showed it. The Linux job now installs the library
and finds the installed package.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Build Catch3 as C++17</title>
<updated>2026-10-31T10:00:24+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-31T10:00:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=8814bd0b796b2e291fa5b4a1033f0313c8a26065'/>
<id>8814bd0b796b2e291fa5b4a1033f0313c8a26065</id>
<content type='text'>
C++17 is still the widest common target, and a library built on it stays
usable from C++17 and every later standard, while C++20 would have left
out many users.

Concepts become enable_if on named traits in Detail/TypeTraits.hpp, which
also replaces std::remove_cvref_t and std::identity. std::span becomes
std::vector references, std::bit_cast becomes static_cast and memcpy,
template lambdas become helper templates, and std::erase_if, contains,
starts_with and ends_with have their C++17 forms. Random::Between no
longer uses a lambda over a constexpr local, which MSVC rejects outside
/permissive-, so the headers work under its default mode too.

Tests give up designated initializers, which MSVC refuses in C++17. CI
builds the matrix in C++17 and C++20, since the headers promise both.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
C++17 is still the widest common target, and a library built on it stays
usable from C++17 and every later standard, while C++20 would have left
out many users.

Concepts become enable_if on named traits in Detail/TypeTraits.hpp, which
also replaces std::remove_cvref_t and std::identity. std::span becomes
std::vector references, std::bit_cast becomes static_cast and memcpy,
template lambdas become helper templates, and std::erase_if, contains,
starts_with and ends_with have their C++17 forms. Random::Between no
longer uses a lambda over a constexpr local, which MSVC rejects outside
/permissive-, so the headers work under its default mode too.

Tests give up designated initializers, which MSVC refuses in C++17. CI
builds the matrix in C++17 and C++20, since the headers promise both.
</pre>
</div>
</content>
</entry>
<entry>
<title>Give macOS one CI job and stop building pull requests twice</title>
<updated>2026-10-29T17:03:06+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-29T17:03:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=db9f14bb7f38425e6005ae2212d83f01f9f2f8be'/>
<id>db9f14bb7f38425e6005ae2212d83f01f9f2f8be</id>
<content type='text'>
macOS runners are the bottleneck of Progmasoft's CI: an organization
runs at most five macOS jobs at a time, shared by every repository, and a
pull request of Catch3 asked for about twenty of them. Every workflow
also listened to both push and pull_request, so each pull request ran
everything twice, once for its branch and once for the pull request.

macOS now has one job, as in the Tala compiler: macOS 26 on Apple
Silicon, Debug, C++17, with AddressSanitizer and UndefinedBehaviorSanitizer
over the most-tests preset, examples and extra tests. The C++14 and C++17,
Debug and Release matrix stays on Ubuntu and Fedora, where it already ran.
ThreadSanitizer, which ran only on macOS, moves to a new Ubuntu job.

The build systems that tested Windows and macOS (Bazel, Meson, Xmake,
Premake) test Windows and Ubuntu instead, with Clang, so their Unix side
is still covered and Linux is covered for the first time. The jobs that do
not depend on the platform leave macOS: CodeQL (build mode none), the
header and license checks, and native coverage, which now builds with
the Clang and LLVM tools of Ubuntu instead of those of Xcode.

Pushes build only devel; pull requests build their branches. The weekly
CodeQL schedule stays.

The required check "Bazel on macos-15" becomes "Bazel on ubuntu-26.04" in
the branch protection and the ruleset when this is merged.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
macOS runners are the bottleneck of Progmasoft's CI: an organization
runs at most five macOS jobs at a time, shared by every repository, and a
pull request of Catch3 asked for about twenty of them. Every workflow
also listened to both push and pull_request, so each pull request ran
everything twice, once for its branch and once for the pull request.

macOS now has one job, as in the Tala compiler: macOS 26 on Apple
Silicon, Debug, C++17, with AddressSanitizer and UndefinedBehaviorSanitizer
over the most-tests preset, examples and extra tests. The C++14 and C++17,
Debug and Release matrix stays on Ubuntu and Fedora, where it already ran.
ThreadSanitizer, which ran only on macOS, moves to a new Ubuntu job.

The build systems that tested Windows and macOS (Bazel, Meson, Xmake,
Premake) test Windows and Ubuntu instead, with Clang, so their Unix side
is still covered and Linux is covered for the first time. The jobs that do
not depend on the platform leave macOS: CodeQL (build mode none), the
header and license checks, and native coverage, which now builds with
the Clang and LLVM tools of Ubuntu instead of those of Xcode.

Pushes build only devel; pull requests build their branches. The weekly
CodeQL schedule stays.

The required check "Bazel on macos-15" becomes "Bazel on ubuntu-26.04" in
the branch protection and the ruleset when this is merged.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Give Catch3 its own build names and headers</title>
<updated>2026-10-24T23:37:35+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-24T23:37:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=126dc333564cb72b5115d9a9242d66694694b6d0'/>
<id>126dc333564cb72b5115d9a9242d66694694b6d0</id>
<content type='text'>
Catch2 compatibility means the API tests are written in: the macros, such
as TEST_CASE and REQUIRE, and the Catch:: namespace. It does not mean
Catch2's build names or header paths. find_package(Catch2) found Catch3,
and a project using both frameworks met two packages, two sets of targets,
two Catch.cmake modules and two catch2/ header trees with the same names.

Build names:
- CMake: project and package Catch3, targets Catch3::Catch3 and
  Catch3::Catch3WithMain, libraries Catch3 and Catch3Main, options
  CATCH3_*, lib/cmake/Catch3 with Catch3Config, and pkg-config catch3 and
  catch3-with-main. The version is Catch3's, 0.3.0, compatible within a
  minor version.
- The CMake scripts are Catch3.cmake (catch3_discover_tests),
  Catch3AddTests.cmake and Catch3ShardTests.cmake
  (catch3_add_sharded_tests); the helpers they define at ctest time have a
  catch3_ prefix. ParseAndAddCatchTests.cmake, deprecated upstream, is gone.
- Bazel //:catch3 and //:catch3_main, Meson catch3 and catch3-with-main
  (with override_dependency), Xmake catch3 and catch3_main, Premake Catch3
  and Catch3WithMain. Visual Studio projects get GUIDs of their own.
- The Progmasoft::Catch3 target and package are gone: property testing
  and snapshots are part of Catch3::Catch3. Their sources now build with
  the library's warning flags, so property failures are built field by
  field (no missing initializers) and the default property name is a
  thread-local pointer to the name its scope owns (no global destructor).

Headers: the engine moved from src/catch2 to src/Progmasoft/Catch3 with
Progmasoft names, so &lt;catch2/catch_test_macros.hpp&gt; is
&lt;Progmasoft/Catch3/TestMacros.hpp&gt;, &lt;catch2/matchers/catch_matchers_string.hpp&gt;
is &lt;Progmasoft/Catch3/Matchers/String.hpp&gt;, and interface headers are named
after their interface, such as Interfaces/IConfig.hpp. Include guards
became #pragma once. The installed headers go to include/Progmasoft.
src/Progmasoft/Context.cpp is StrategyContext.cpp, so no two sources share
a file name.

tools/scripts/upstreamFiles.txt lists the files that come from Catch2.
The license check expects BSL-1.0 on them and Progmasoft's header on the
rest of src/Progmasoft; the convenience-header check, the amalgamation
script and the surrogate tests take the engine's headers from it. The
amalgamated files are regenerated. The header-guard workflow checks for
#pragma once instead of checkguard.

Documents, the README and the release notes describe the new names.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Catch2 compatibility means the API tests are written in: the macros, such
as TEST_CASE and REQUIRE, and the Catch:: namespace. It does not mean
Catch2's build names or header paths. find_package(Catch2) found Catch3,
and a project using both frameworks met two packages, two sets of targets,
two Catch.cmake modules and two catch2/ header trees with the same names.

Build names:
- CMake: project and package Catch3, targets Catch3::Catch3 and
  Catch3::Catch3WithMain, libraries Catch3 and Catch3Main, options
  CATCH3_*, lib/cmake/Catch3 with Catch3Config, and pkg-config catch3 and
  catch3-with-main. The version is Catch3's, 0.3.0, compatible within a
  minor version.
- The CMake scripts are Catch3.cmake (catch3_discover_tests),
  Catch3AddTests.cmake and Catch3ShardTests.cmake
  (catch3_add_sharded_tests); the helpers they define at ctest time have a
  catch3_ prefix. ParseAndAddCatchTests.cmake, deprecated upstream, is gone.
- Bazel //:catch3 and //:catch3_main, Meson catch3 and catch3-with-main
  (with override_dependency), Xmake catch3 and catch3_main, Premake Catch3
  and Catch3WithMain. Visual Studio projects get GUIDs of their own.
- The Progmasoft::Catch3 target and package are gone: property testing
  and snapshots are part of Catch3::Catch3. Their sources now build with
  the library's warning flags, so property failures are built field by
  field (no missing initializers) and the default property name is a
  thread-local pointer to the name its scope owns (no global destructor).

Headers: the engine moved from src/catch2 to src/Progmasoft/Catch3 with
Progmasoft names, so &lt;catch2/catch_test_macros.hpp&gt; is
&lt;Progmasoft/Catch3/TestMacros.hpp&gt;, &lt;catch2/matchers/catch_matchers_string.hpp&gt;
is &lt;Progmasoft/Catch3/Matchers/String.hpp&gt;, and interface headers are named
after their interface, such as Interfaces/IConfig.hpp. Include guards
became #pragma once. The installed headers go to include/Progmasoft.
src/Progmasoft/Context.cpp is StrategyContext.cpp, so no two sources share
a file name.

tools/scripts/upstreamFiles.txt lists the files that come from Catch2.
The license check expects BSL-1.0 on them and Progmasoft's header on the
rest of src/Progmasoft; the convenience-header check, the amalgamation
script and the surrogate tests take the engine's headers from it. The
amalgamated files are regenerated. The header-guard workflow checks for
#pragma once instead of checkguard.

Documents, the README and the release notes describe the new names.
</pre>
</div>
</content>
</entry>
<entry>
<title>Build on the platforms the Visual X# compiler builds on</title>
<updated>2026-10-10T23:58:27+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-10T23:58:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=ab1214937f57fb81a56e615a0aef8269ade5da91'/>
<id>ab1214937f57fb81a56e615a0aef8269ade5da91</id>
<content type='text'>
The compiler that uses this framework first is built and tested on
Windows with the Visual Studio 2026 image, macOS 15 and 26, Ubuntu 26.04
and Fedora 43. This repository was tested on Windows Server 2022 and
2025, macOS 14, 15 and 15 on Intel, and on no Linux at all.

The Windows builds move to the windows-2025-vs2026 image, in the basic
builds and in the Xmake, Bazel and Meson builds. The macOS builds and
the sanitizer builds run on macos-15 and macos-26. A new workflow builds
and tests on Ubuntu 26.04 and, in a container, on Fedora 43, with Clang,
as C++14 and C++17, Debug and Release.

Two jobs stay on windows-2022: the Premake job generates Visual Studio
2022 projects, and the Conan job names the Visual Studio 17 generator
and the v144 runtime. Moving them means moving those tools to Visual
Studio 2026, which is a change of its own.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The compiler that uses this framework first is built and tested on
Windows with the Visual Studio 2026 image, macOS 15 and 26, Ubuntu 26.04
and Fedora 43. This repository was tested on Windows Server 2022 and
2025, macOS 14, 15 and 15 on Intel, and on no Linux at all.

The Windows builds move to the windows-2025-vs2026 image, in the basic
builds and in the Xmake, Bazel and Meson builds. The macOS builds and
the sanitizer builds run on macos-15 and macos-26. A new workflow builds
and tests on Ubuntu 26.04 and, in a container, on Fedora 43, with Clang,
as C++14 and C++17, Debug and Release.

Two jobs stay on windows-2022: the Premake job generates Visual Studio
2022 projects, and the Conan job names the Visual Studio 17 generator
and the v144 runtime. Moving them means moving those tools to Visual
Studio 2026, which is a change of its own.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix and improve GitHub Actions CI</title>
<updated>2021-04-30T21:26:28+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2021-04-30T12:02:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=2cb5210caf35bf8fc29ade2e5570cc0f37537951'/>
<id>2cb5210caf35bf8fc29ade2e5570cc0f37537951</id>
<content type='text'>
* Fixed problem with older compilers by explicitly installing the
  right compiler version.
* Split apart simple builds that can be well described by a build
  matrix, and builds that need special CMake defines or similar
  special snowflake handling.
* Ported some extras + examples builds from TravisCI to GitHub
  Actions.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Fixed problem with older compilers by explicitly installing the
  right compiler version.
* Split apart simple builds that can be well described by a build
  matrix, and builds that need special CMake defines or similar
  special snowflake handling.
* Ported some extras + examples builds from TravisCI to GitHub
  Actions.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add Clang 10 + C++17 build to linux CI</title>
<updated>2021-02-20T21:26:22+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2021-02-20T20:20:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=749d9537122106191766ead871186ba69861a43b'/>
<id>749d9537122106191766ead871186ba69861a43b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Disable C++ extensions for linux CI builds</title>
<updated>2021-02-20T19:39:23+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2021-02-20T19:37:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=4b50b13970c0aa82b65e0ea78a8af04c954eb9f8'/>
<id>4b50b13970c0aa82b65e0ea78a8af04c954eb9f8</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add Linux and Windows CI builds with surrogate TUs</title>
<updated>2021-02-19T22:23:00+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2021-02-16T15:05:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=29050daec0fc1a1b092ac2dc711bfc40648b8976'/>
<id>29050daec0fc1a1b092ac2dc711bfc40648b8976</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
