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