make_generated_files.py: Add --check option

Add --check option to be able to check
that make_generated_files.py and the
build systems are in-sync.

Signed-off-by: Ronald Cron <[email protected]>
This commit is contained in:
Ronald Cron
2025-03-14 14:53:48 +01:00
parent 5eafd1d81e
commit 68685cec29
+77 -1
View File
@@ -9,6 +9,8 @@
Generate the TF-PSA-Crypto generated files
"""
import argparse
import filecmp
import shutil
import subprocess
import sys
@@ -22,7 +24,9 @@ class GenerationScript:
Representation of a script generating a configuration independent file.
"""
# pylint: disable=too-few-public-methods
def __init__(self, script: Path, files: List[Path]):
def __init__(self, script: Path, files: List[Path],
output_dir_option: Optional[str] = None,
output_file_option: Optional[str] = None):
""" Path from the root of Mbed TLS or TF-PSA-Crypto of the generation script """
self.script = script
"""
@@ -30,6 +34,16 @@ class GenerationScript:
files the script generates.
"""
self.files = files
"""
Output directory script argument. Can be an empty string in case it is a
positional argument.
"""
self.output_dir_option = output_dir_option
"""
Output file script argument. Can be an empty string in case it is a
positional argument.
"""
self.output_file_option = output_file_option
def get_generation_script_files(generation_script: str):
"""
@@ -50,30 +64,37 @@ if build_tree.looks_like_tf_psa_crypto_root("."):
Path("scripts/generate_driver_wrappers.py"),
[Path("core/psa_crypto_driver_wrappers.h"),
Path("core/psa_crypto_driver_wrappers_no_static.c")],
"", None
),
GenerationScript(
Path("framework/scripts/generate_test_keys.py"),
[Path("tests/include/test/test_keys.h")],
None, "--output"
),
GenerationScript(
Path("scripts/generate_psa_constants.py"),
[Path("programs/psa/psa_constant_names_generated.c")],
"", None
),
GenerationScript(
Path("framework/scripts/generate_bignum_tests.py"),
get_generation_script_files("framework/scripts/generate_bignum_tests.py"),
"--directory", None
),
GenerationScript(
Path("framework/scripts/generate_config_tests.py"),
get_generation_script_files("framework/scripts/generate_config_tests.py"),
"--directory", None
),
GenerationScript(
Path("framework/scripts/generate_ecp_tests.py"),
get_generation_script_files("framework/scripts/generate_ecp_tests.py"),
"--directory", None
),
GenerationScript(
Path("framework/scripts/generate_psa_tests.py"),
get_generation_script_files("framework/scripts/generate_psa_tests.py"),
"--directory", None
),
]
@@ -83,38 +104,51 @@ if build_tree.looks_like_mbedtls_root(".") and not build_tree.is_mbedtls_3_6():
GenerationScript(
Path("scripts/generate_errors.pl"),
[Path("library/error.c")],
None, "tf-psa-crypto/drivers/builtin/include/mbedtls \
include/mbedtls/ \
scripts/data_files"
),
GenerationScript(
Path("scripts/generate_features.pl"),
[Path("library/version_features.c")],
None, "include/mbedtls/ scripts/data_files"
),
GenerationScript(
Path("framework/scripts/generate_ssl_debug_helpers.py"),
[Path("library/ssl_debug_helpers_generated.c")],
"", None
),
GenerationScript(
Path("framework/scripts/generate_test_keys.py"),
[Path("tests/include/test/test_keys.h")],
None, "--output"
),
GenerationScript(
Path("framework/scripts/generate_test_cert_macros.py"),
[Path("tests/include/test/test_certs.h")],
None, "--output"
),
GenerationScript(
Path("scripts/generate_query_config.pl"),
[Path("programs/test/query_config.c")],
None, "include/mbedtls/mbedtls_config.h \
tf-psa-crypto/include/psa/crypto_config.h \
scripts/data_files/query_config.fmt"
),
GenerationScript(
Path("framework/scripts/generate_config_tests.py"),
get_generation_script_files("framework/scripts/generate_config_tests.py"),
"--directory", None
),
GenerationScript(
Path("framework/scripts/generate_tls13_compat_tests.py"),
[Path("tests/opt-testcases/tls13-compat.sh")],
None, "--output"
),
GenerationScript(
Path("scripts/generate_visualc_files.pl"),
get_generation_script_files("scripts/generate_visualc_files.pl"),
"--directory", None
),
]
@@ -137,6 +171,41 @@ def make_generated_files(generation_scripts: List[GenerationScript]):
for generation_script in generation_scripts:
subprocess.run([str(generation_script.script)], check=True)
def check_generated_files(generation_scripts: List[GenerationScript], root: Path):
"""
Check that the given root directory contains the generated files as expected/
generated by this script.
"""
for generation_script in generation_scripts:
for file in generation_script.files:
file = root / file
bak_file = file.with_name(file.name + ".bak")
if bak_file.exists():
bak_file.unlink()
file.rename(bak_file)
command = [str(generation_script.script)]
if generation_script.output_dir_option is not None:
command += [generation_script.output_dir_option,
str(root / Path(generation_script.files[0].parent))]
elif generation_script.output_file_option is not None:
command += generation_script.output_file_option.split()
command += [str(root / Path(generation_script.files[0]))]
subprocess.run([item for item in command if item.strip()], check=True)
for file in generation_script.files:
file = root / file
bak_file = file.with_name(file.name + ".bak")
if not filecmp.cmp(file, bak_file):
ref_file = file.with_name(file.name + ".ref")
ref_file = root / ref_file
if ref_file.exists():
ref_file.unlink()
shutil.copy(file, ref_file)
print(f"Generated file {file} not identical to the reference one {ref_file}.")
file.unlink()
bak_file.rename(file)
def main():
"""
Main function of this program
@@ -145,6 +214,11 @@ def main():
parser.add_argument('--list', action='store_true',
default=False, help='List generated files.')
parser.add_argument('--root', metavar='DIR',
help='Root of the tree containing the generated files \
to check (default: Mbed TLS or TF-PSA-Cryto root.)')
parser.add_argument('--check', action='store_true',
default=False, help='Check the generated files in root')
args = parser.parse_args()
@@ -162,6 +236,8 @@ def main():
files = get_generated_files(generation_scripts)
for file in files:
print(str(file))
elif args.check:
check_generated_files(generation_scripts, Path(args.root or "."))
else:
make_generated_files(generation_scripts)