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

summaryrefslogtreecommitdiffhomepage
path: root/tools/scripts/generateAmalgamatedFiles.py
diff options
context:
space:
mode:
authorLeitwolf2026-10-25 10:31:36 +0300
committerGitHub2026-10-25 10:31:36 +0300
commitd2e3e074bb2e1b8ffd9fc990d0b87667ea602f58 (patch)
tree0bce4462b2e190c39b3e1c5f697e3e4abd1a5e2a /tools/scripts/generateAmalgamatedFiles.py
parent13f81a480a93807c14dddb5abdb97355ced4d4c5 (diff)
parent126dc333564cb72b5115d9a9242d66694694b6d0 (diff)
downloadcatch3-d2e3e074bb2e1b8ffd9fc990d0b87667ea602f58.tar.gz
Merge pull request #18 from Progmasoft/build/catch3-identity
Give Catch3 its own build names and headers
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