xref: /aosp_15_r20/external/mbedtls/scripts/mbedtls_dev/build_tree.py (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi"""Mbed TLS build tree information and manipulation.
2*62c56f98SSadaf Ebrahimi"""
3*62c56f98SSadaf Ebrahimi
4*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors
5*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6*62c56f98SSadaf Ebrahimi#
7*62c56f98SSadaf Ebrahimi
8*62c56f98SSadaf Ebrahimiimport os
9*62c56f98SSadaf Ebrahimiimport inspect
10*62c56f98SSadaf Ebrahimi
11*62c56f98SSadaf Ebrahimidef looks_like_psa_crypto_root(path: str) -> bool:
12*62c56f98SSadaf Ebrahimi    """Whether the given directory looks like the root of the PSA Crypto source tree."""
13*62c56f98SSadaf Ebrahimi    return all(os.path.isdir(os.path.join(path, subdir))
14*62c56f98SSadaf Ebrahimi               for subdir in ['include', 'core', 'drivers', 'programs', 'tests'])
15*62c56f98SSadaf Ebrahimi
16*62c56f98SSadaf Ebrahimidef looks_like_mbedtls_root(path: str) -> bool:
17*62c56f98SSadaf Ebrahimi    """Whether the given directory looks like the root of the Mbed TLS source tree."""
18*62c56f98SSadaf Ebrahimi    return all(os.path.isdir(os.path.join(path, subdir))
19*62c56f98SSadaf Ebrahimi               for subdir in ['include', 'library', 'programs', 'tests'])
20*62c56f98SSadaf Ebrahimi
21*62c56f98SSadaf Ebrahimidef looks_like_root(path: str) -> bool:
22*62c56f98SSadaf Ebrahimi    return looks_like_psa_crypto_root(path) or looks_like_mbedtls_root(path)
23*62c56f98SSadaf Ebrahimi
24*62c56f98SSadaf Ebrahimidef check_repo_path():
25*62c56f98SSadaf Ebrahimi    """
26*62c56f98SSadaf Ebrahimi    Check that the current working directory is the project root, and throw
27*62c56f98SSadaf Ebrahimi    an exception if not.
28*62c56f98SSadaf Ebrahimi    """
29*62c56f98SSadaf Ebrahimi    if not all(os.path.isdir(d) for d in ["include", "library", "tests"]):
30*62c56f98SSadaf Ebrahimi        raise Exception("This script must be run from Mbed TLS root")
31*62c56f98SSadaf Ebrahimi
32*62c56f98SSadaf Ebrahimidef chdir_to_root() -> None:
33*62c56f98SSadaf Ebrahimi    """Detect the root of the Mbed TLS source tree and change to it.
34*62c56f98SSadaf Ebrahimi
35*62c56f98SSadaf Ebrahimi    The current directory must be up to two levels deep inside an Mbed TLS
36*62c56f98SSadaf Ebrahimi    source tree.
37*62c56f98SSadaf Ebrahimi    """
38*62c56f98SSadaf Ebrahimi    for d in [os.path.curdir,
39*62c56f98SSadaf Ebrahimi              os.path.pardir,
40*62c56f98SSadaf Ebrahimi              os.path.join(os.path.pardir, os.path.pardir)]:
41*62c56f98SSadaf Ebrahimi        if looks_like_root(d):
42*62c56f98SSadaf Ebrahimi            os.chdir(d)
43*62c56f98SSadaf Ebrahimi            return
44*62c56f98SSadaf Ebrahimi    raise Exception('Mbed TLS source tree not found')
45*62c56f98SSadaf Ebrahimi
46*62c56f98SSadaf Ebrahimi
47*62c56f98SSadaf Ebrahimidef guess_mbedtls_root():
48*62c56f98SSadaf Ebrahimi    """Guess mbedTLS source code directory.
49*62c56f98SSadaf Ebrahimi
50*62c56f98SSadaf Ebrahimi    Return the first possible mbedTLS root directory
51*62c56f98SSadaf Ebrahimi    """
52*62c56f98SSadaf Ebrahimi    dirs = set({})
53*62c56f98SSadaf Ebrahimi    for frame in inspect.stack():
54*62c56f98SSadaf Ebrahimi        path = os.path.dirname(frame.filename)
55*62c56f98SSadaf Ebrahimi        for d in ['.', os.path.pardir] \
56*62c56f98SSadaf Ebrahimi                 + [os.path.join(*([os.path.pardir]*i)) for i in range(2, 10)]:
57*62c56f98SSadaf Ebrahimi            d = os.path.abspath(os.path.join(path, d))
58*62c56f98SSadaf Ebrahimi            if d in dirs:
59*62c56f98SSadaf Ebrahimi                continue
60*62c56f98SSadaf Ebrahimi            dirs.add(d)
61*62c56f98SSadaf Ebrahimi            if looks_like_root(d):
62*62c56f98SSadaf Ebrahimi                return d
63*62c56f98SSadaf Ebrahimi    raise Exception('Mbed TLS source tree not found')
64