Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,462 changes: 2,124 additions & 1,338 deletions configure.py

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/configs/git-blame-ignore-revs
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,6 @@ fe7a2a1d850ae02934ea04d25fa214c825442535

# [clang-format] AllowShortBlocksOnASingleLine
de48a2eb6d2d77e104044da84c2fb7df5c08d65a

# [ruff] initial application
a05a80f3a993a726c53efe513c11480c594572be
121 changes: 61 additions & 60 deletions src/configs/sphinx/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@
import sys
import re

#import sphinx
# import sphinx


def check_for_tag(tag):
# Nasty hack :(
try:
opt_t = sys.argv.index('-t')
opt_t = sys.argv.index("-t")
opt_tag = sys.argv.index(tag)
return opt_t + 1 == opt_tag
except ValueError:
Expand All @@ -22,76 +23,77 @@ def parse_version_file(version_path):

results = {}
for line in version_file.readlines():
if not line or line[0] == '#':
if not line or line[0] == "#":
continue
match = key_and_val.match(line)
if match:
key = match.group(1)
val = match.group(2)

if val == 'None':
if val == "None":
val = None
elif val.startswith("'") and val.endswith("'"):
val = val[1:len(val)-1]
val = val[1 : len(val) - 1]
else:
val = int(val)

results[key] = val
return results

version_info = parse_version_file('../../build-data/version.txt')

version_major = version_info['release_major']
version_minor = version_info['release_minor']
version_patch = version_info['release_patch']
version_suffix = version_info['release_suffix']
version_info = parse_version_file("../../build-data/version.txt")

version_major = version_info["release_major"]
version_minor = version_info["release_minor"]
version_patch = version_info["release_patch"]
version_suffix = version_info["release_suffix"]

is_website_build = check_for_tag('website')
is_website_build = check_for_tag("website")

needs_sphinx = '1.2'
needs_sphinx = "1.2"

templates_path = ['templates']
templates_path = ["templates"]

source_suffix = '.rst'
source_suffix = ".rst"

source_encoding = 'utf-8-sig'
source_encoding = "utf-8-sig"

master_doc = 'contents'
master_doc = "contents"

project = u'botan'
copyright = u'2000-2023, The Botan Authors'
project = "botan"
copyright = "2000-2023, The Botan Authors"

version = '%d.%d' % (version_major, version_minor)
release = '%d.%d.%d%s' % (version_major, version_minor, version_patch, version_suffix)
version = "%d.%d" % (version_major, version_minor)
release = "%d.%d.%d%s" % (version_major, version_minor, version_patch, version_suffix)

#today = ''
today_fmt = '%Y-%m-%d'
# today = ''
today_fmt = "%Y-%m-%d"

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = []

# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = False

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# show_authors = False

highlight_language = 'cpp'
highlight_language = "cpp"

# The name of the Pygments (syntax highlighting) style to use.
#pygments_style = 'sphinx'
# pygments_style = 'sphinx'

# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# modindex_common_prefix = []


# -- Options for HTML output ---------------------------------------------------
Expand All @@ -101,36 +103,37 @@ def parse_version_file(version_path):

try:
# On Arch this is python-sphinx-furo
import furo # noqa: F401
import furo # noqa: F401

html_theme = "furo"

# Add a small edit button to each document to allow visitors to easily
# propose changes to that document using the repository’s source control system.
html_theme_options = {
'source_repository': 'https://github.com/randombit/botan/',
'source_branch': 'master',
'source_directory': 'doc/',
"source_repository": "https://github.com/randombit/botan/",
"source_branch": "master",
"source_directory": "doc/",
}
except ImportError:
print("Could not import furo theme; falling back to agago")
html_theme = 'agogo'
html_theme = "agogo"
html_theme_path = []

# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
html_title = 'Botan'
html_title = "Botan"

# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# html_logo = None

# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# html_favicon = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
Expand All @@ -139,27 +142,27 @@ def parse_version_file(version_path):

# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%Y-%m-%d'
html_last_updated_fmt = "%Y-%m-%d"

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# html_additional_pages = {}

# If false, no module index is generated.
#html_domain_indices = True
# html_domain_indices = True

# If false, no index is generated.
#html_use_index = True
# html_use_index = True

# If true, the index is split into individual pages for each letter.
#html_split_index = False
# html_split_index = False

# If true, links to the reST sources are added to the pages.
html_show_sourcelink = False
Expand All @@ -174,58 +177,56 @@ def parse_version_file(version_path):
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
if is_website_build:
html_use_opensearch = 'https://botan.randombit.net/'
html_use_opensearch = "https://botan.randombit.net/"
else:
html_use_opensearch = ''
html_use_opensearch = ""

# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# html_file_suffix = None

# Output file base name for HTML help builder.
htmlhelp_basename = 'botandoc'
htmlhelp_basename = "botandoc"

# -- Options for LaTeX output --------------------------------------------------

# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'
# latex_paper_size = 'letter'

# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'
# latex_font_size = '10pt'

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).

authors = u'The Botan Authors'
authors = "The Botan Authors"
latex_documents = [
('contents', 'botan.tex', u'Botan Reference Guide', authors, 'manual'),
("contents", "botan.tex", "Botan Reference Guide", authors, "manual"),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# latex_use_parts = False

# If true, show page references after internal links.
latex_show_pagerefs = False

# If true, show URL addresses after external links.
latex_show_urls = 'inline'
latex_show_urls = "inline"

# Additional stuff for the LaTeX preamble.
#latex_preamble = ''
# latex_preamble = ''

# Documents to append as an appendix to all manuals.
#latex_appendices = []
# latex_appendices = []

# If false, no module index is generated.
latex_domain_indices = False

latex_elements = {
'printindex': '\\footnotesize\\raggedright\\printindex'
}
latex_elements = {"printindex": "\\footnotesize\\raggedright\\printindex"}

# Give all sections a label, so we can reference them
extensions = [
Expand Down
51 changes: 32 additions & 19 deletions src/ct_selftest/ct_selftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,28 @@
from enum import StrEnum, auto
import json

def run_command(cmd: list[str], is_text = True):
""" Run the command . """

def run_command(cmd: list[str], is_text=True):
"""Run the command ."""
return subprocess.run(cmd, capture_output=True, text=is_text, check=False)


def run_with_valgrind(cmd: list[str]):
""" Run a command with valgrind. """
valgrind_args = ['valgrind',
'-v',
'--error-exitcode=2']
"""Run a command with valgrind."""
valgrind_args = ["valgrind", "-v", "--error-exitcode=2"]
res = run_command(valgrind_args + cmd, is_text=False)
# valgrind may output non-utf-8 characters
res.stdout = res.stdout.decode("utf-8", errors="replace")
res.stderr = res.stderr.decode("utf-8", errors="replace")
return res


class ValgrindTest:
""" A single test from ct_selftest """
"""A single test from ct_selftest"""

class Status(StrEnum):
""" Defines the test result status """
"""Defines the test result status"""

OK = auto()
WARNING = auto()
ERROR = auto()
Expand All @@ -55,25 +57,30 @@ def __init__(self, name, expect_failure, needs_special_config):
def from_line(line: str):
info = line.split("\t")
assert len(info) == 3
return ValgrindTest(name=info[2],
expect_failure=info[0] == "true",
needs_special_config=info[1] == "true")
return ValgrindTest(
name=info[2],
expect_failure=info[0] == "true",
needs_special_config=info[1] == "true",
)

def runnable(self, build_cfg):
""" Decide whether or not to run this test given build config info """
"""Decide whether or not to run this test given build config info"""
if not self.needs_special_config:
return True

if not build_cfg:
return False # test has special build requirements, but we have no info

if self.name == "clang_vs_bare_metal_ct_mask":
return build_cfg["cc_macro"] == "CLANG" and "-Os" in build_cfg["cc_compile_flags"]
return (
build_cfg["cc_macro"] == "CLANG"
and "-Os" in build_cfg["cc_compile_flags"]
)

raise LookupError(f"Unknown special config test '{self.name}'")

def run(self, exe_path: str, build_config):
""" Run the test and return whether it succeeded """
"""Run the test and return whether it succeeded"""

if not self.runnable(build_config):
self.status = self.Status.SKIP
Expand All @@ -98,15 +105,21 @@ def run(self, exe_path: str, build_config):

@staticmethod
def read_test_list(ct_selftest_test_list: str) -> list[Self]:
""" Read the list of tests from the output of `ct_selftest --list`. """
"""Read the list of tests from the output of `ct_selftest --list`."""

return [ValgrindTest.from_line(line) for line in ct_selftest_test_list.split("\n")[2:] if line]
return [
ValgrindTest.from_line(line)
for line in ct_selftest_test_list.split("\n")[2:]
if line
]


def main(): # pylint: disable=missing-function-docstring
def main(): # pylint: disable=missing-function-docstring
parser = argparse.ArgumentParser("ct_selftests")
parser.add_argument("ct_selftest_path", help="Path to the ct_selftest executable")
parser.add_argument("--build-config-path", help="Path to Botan's build-config.json file", default="")
parser.add_argument(
"--build-config-path", help="Path to Botan's build-config.json file", default=""
)

args = parser.parse_args()

Expand Down Expand Up @@ -145,5 +158,5 @@ def open_build_config(build_config_path):
print(test.stderr)


if __name__ == '__main__':
if __name__ == "__main__":
sys.exit(main())
Loading
Loading