Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/tools/scripts/generateAmalgamatedFiles.py
diff options
context:
space:
mode:
authorLeitwolf112026-10-25 02:37:35 +0300
committerLeitwolf112026-10-25 02:37:35 +0300
commit126dc333564cb72b5115d9a9242d66694694b6d0 (patch)
tree0bce4462b2e190c39b3e1c5f697e3e4abd1a5e2a /tools/scripts/generateAmalgamatedFiles.py
parent13f81a480a93807c14dddb5abdb97355ced4d4c5 (diff)
downloadcatch3-126dc333564cb72b5115d9a9242d66694694b6d0.tar.gz
Give Catch3 its own build names and headers
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 <catch2/catch_test_macros.hpp> is <Progmasoft/Catch3/TestMacros.hpp>, <catch2/matchers/catch_matchers_string.hpp> is <Progmasoft/Catch3/Matchers/String.hpp>, 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.
Diffstat (limited to 'tools/scripts/generateAmalgamatedFiles.py')
-rwxr-xr-xtools/scripts/generateAmalgamatedFiles.py37
1 files changed, 25 insertions, 12 deletions
diff --git a/tools/scripts/generateAmalgamatedFiles.py b/tools/scripts/generateAmalgamatedFiles.py
index 2d40bcb4..ffd069ef 100755
--- a/tools/scripts/generateAmalgamatedFiles.py
+++ b/tools/scripts/generateAmalgamatedFiles.py
@@ -9,11 +9,11 @@ import os
import re
import datetime
-from scriptCommon import catchPath
+from scriptCommon import catchPath, upstreamFiles
from releaseCommon import Version
root_path = os.path.join(catchPath, 'src')
-starting_header = os.path.join(root_path, 'catch2', 'catch_all.hpp')
+starting_header = os.path.join(root_path, 'Progmasoft', 'Catch3', 'All.hpp')
output_header = os.path.join(catchPath, 'extras', 'catch_amalgamated.hpp')
output_cpp = os.path.join(catchPath, 'extras', 'catch_amalgamated.cpp')
@@ -71,16 +71,28 @@ def formatted_file_header(version):
# processed again)
concatenated_headers = set()
-internal_include_parser = re.compile(r'\s*#include <(catch2/.*)>.*')
+# The engine's files are the ones that come from Catch2.
+upstream_files = upstreamFiles()
+include_parser = re.compile(r'\s*#include <(Progmasoft/Catch3/[^>]+)>.*')
+
+
+def engine_include(line):
+ """The engine header a line includes, or None."""
+ m = include_parser.match(line)
+ # The configuration header is generated from UserConfig.hpp.in.
+ if m and ('src/' + m.group(1) in upstream_files
+ or m.group(1) == 'Progmasoft/Catch3/UserConfig.hpp'):
+ return m.group(1)
+ return None
def concatenate_file(out, filename: str, expand_headers: bool) -> int:
# Gathers statistics on how many headers were expanded
concatenated = 1
with open(filename, mode='r', encoding='utf-8') as input:
for line in input:
- if line in copyright_lines:
+ if line in copyright_lines or line.strip() == '#pragma once':
continue
- m = internal_include_parser.match(line)
+ m = engine_include(line)
# The runner's headers are expanded at the start of the .cpp file.
if not m and not expand_headers and progmasoft_include_parser.match(line):
continue
@@ -99,7 +111,7 @@ def concatenate_file(out, filename: str, expand_headers: bool) -> int:
if not expand_headers:
continue
- next_header = m.group(1)
+ next_header = m
# We have to avoid re-expanding the same header over and
# over again, or the header will end up with couple
# hundred thousands lines (~300k as of preview3 :-) )
@@ -110,7 +122,7 @@ def concatenate_file(out, filename: str, expand_headers: bool) -> int:
# because it has not been generated yet at this point.
# The code around it should be written so that just not including
# it is equivalent with all-default user configuration.
- if next_header == 'catch2/catch_user_config.hpp':
+ if next_header == 'Progmasoft/Catch3/UserConfig.hpp':
concatenated_headers.add(next_header)
continue
@@ -142,8 +154,8 @@ def concatenate_runner_file(out, filename: str, expand_headers: bool):
for line in input:
if line.strip() == '#pragma once':
continue
- # Catch2's own headers are all in the amalgamated header.
- if internal_include_parser.match(line):
+ # The engine's headers are all in the amalgamated header.
+ if engine_include(line):
continue
m = progmasoft_include_parser.match(line)
if not m:
@@ -161,7 +173,8 @@ def concatenate_runner_file(out, filename: str, expand_headers: bool):
def generate_cpp():
from glob import glob
- cpp_files = sorted(glob(os.path.join(root_path, 'catch2', '**/*.cpp'), recursive=True))
+ cpp_files = sorted(os.path.join(catchPath, path) for path in upstream_files
+ if path.endswith('.cpp'))
runner_headers = sorted(glob(os.path.join(root_path, 'Progmasoft', 'Runner', '*.hpp'))) + [
os.path.join(root_path, 'Progmasoft', 'Catch3', name)
for name in ('Results.hpp', 'Runner.hpp', 'Version.hpp', 'XmlWriter.hpp')]
@@ -171,7 +184,7 @@ def generate_cpp():
with open(output_cpp, mode='w', encoding='utf-8') as cpp:
cpp.write(formatted_file_header(Version()))
cpp.write('\n#include "catch_amalgamated.hpp"\n')
- concatenate_file(cpp, os.path.join(root_path, 'catch2/internal/catch_windows_h_proxy.hpp'), False)
+ concatenate_file(cpp, os.path.join(root_path, 'Progmasoft/Catch3/Internal/WindowsHProxy.hpp'), False)
# The runner's headers come first: Catch::Session reaches the runner.
for header in runner_headers:
header = os.path.normpath(header)
@@ -195,6 +208,6 @@ if __name__ == "__main__":
# * The .cpp file needs to start with `#include "catch_amalgamated.hpp"
# * include guards can be left/stripped, doesn't matter
# * *.cpp files should be included sorted, to minimize diffs between versions
-# * *.hpp files should also be somehow sorted -> use catch_all.hpp as the
+# * *.hpp files should also be somehow sorted -> use Progmasoft/Catch3/All.hpp as the
# * entrypoint
# * allow disabling main in the .cpp amalgamation