# Проверка ump_logger на модели пк. Комментарии и исходный текст в UTF-8. # Продолжает текущий вызов, список или выражение: """Сборка и запуск исходного регистратора с подменой GPIO/IRQ на Windows.; порядок аргументов сохраняется. """Сборка и запуск исходного регистратора с подменой GPIO/IRQ на Windows. Нужны GCC либо Clang и lld-link в PATH. TEMPLATES_ROOT задаёт библиотеку. Проверяется алгоритм, но не ABI и тайминги TI. DLL создаётся во временной папке; исходные .out/.hex прошивки не затрагиваются. """ # Подключает модуль ctypes для этой проверки или подготовки сборки. import ctypes # Подключает модуль os для этой проверки или подготовки сборки. import os # Импортирует необходимые имена: from pathlib import Path. from pathlib import Path # Подключает модуль subprocess для этой проверки или подготовки сборки. import subprocess # Подключает модуль shutil для этой проверки или подготовки сборки. import shutil # Подключает модуль tempfile для этой проверки или подготовки сборки. import tempfile # Задаёт root по выражению справа; значение используется последующими операциями. root = Path(__file__).resolve().parents[2] # Задаёт templates по выражению справа; значение используется последующими операциями. templates = Path(os.environ.get('TEMPLATES_ROOT', root.parent / 'newProject/SETGUI/third_party/templates')) # Задаёт protocol по выражению справа; значение используется последующими операциями. protocol = templates / 'c/set-protocol' # Задаёт compiler по выражению справа; значение используется последующими операциями. compiler = os.environ.get('CC') or shutil.which('clang') or shutil.which('gcc') # Проверяет условие if not compiler перед выполнением следующего блока. if not compiler: # Останавливает текущую операцию с исключением SystemExit('Clang or GCC is required in PATH'). raise SystemExit('Clang or GCC is required in PATH') # Задаёт link_flags по выражению справа; значение используется последующими операциями. link_flags = [] if 'gcc' in Path(compiler).name else ['-nostdlib', '-fuse-ld=lld', '-Wl,/noentry,/nodefaultlib'] # Открывает управляемый ресурс tempfile.TemporaryDirectory(prefix='ump-recorder-') as directory с автоматическим освобождением. with tempfile.TemporaryDirectory(prefix='ump-recorder-') as directory: # Exercise the production identity binding too, using a build-local header. # Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова. subprocess.run([ # Продолжает текущий вызов, список или выражение: os.sys.executable, str(root / 'UKSSTMS320F28335/prepare_identity.py'),; порядок аргументов сохраняется. os.sys.executable, str(root / 'UKSSTMS320F28335/prepare_identity.py'), # Продолжает текущий вызов, список или выражение: '--project', str(root / 'UKSSTMS320F28335'), '--templates', str(templates),; порядок аргументов сохраняется. '--project', str(root / 'UKSSTMS320F28335'), '--templates', str(templates), # Продолжает текущий вызов, список или выражение: '--output', directory,; порядок аргументов сохраняется. '--output', directory, # Задаёт ], check по выражению справа; значение используется последующими операциями. ], check=True) # Задаёт library по выражению справа; значение используется последующими операциями. library = Path(directory) / 'recorder_test.dll' # Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова. subprocess.run([ # Продолжает текущий вызов, список или выражение: compiler, '-shared', *link_flags, '-Wno-unknown-pragmas', '-Wno-int-to-pointer-cast',; порядок аргументов сохраняется. compiler, '-shared', *link_flags, '-Wno-unknown-pragmas', '-Wno-int-to-pointer-cast', # Продолжает текущий вызов, список или выражение: '-Itests/ump_logger/stubs', '-ISource/Internal/Include',; порядок аргументов сохраняется. '-Itests/ump_logger/stubs', '-ISource/Internal/Include', # Продолжает текущий вызов, список или выражение: '-I' + str(protocol), '-I' + str(protocol / 'ports/tms320f28335'),; порядок аргументов сохраняется. '-I' + str(protocol), '-I' + str(protocol / 'ports/tms320f28335'), # Продолжает текущий вызов, список или выражение: '-I' + str(templates / 'c/firmware-info/include'), '-I' + directory,; порядок аргументов сохраняется. '-I' + str(templates / 'c/firmware-info/include'), '-I' + directory, # Продолжает текущий вызов, список или выражение: 'tests/ump_logger/recorder_test.c', 'Source/Internal/shared_ump.c', '-o', str(library),; порядок аргументов сохраняется. 'tests/ump_logger/recorder_test.c', 'Source/Internal/shared_ump.c', '-o', str(library), # Задаёт ], cwd по выражению справа; значение используется последующими операциями. ], cwd=root, check=True) # Отдельный процесс освобождает DLL до удаления временной папки Windows. # Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова. subprocess.run([ # Продолжает текущий вызов, список или выражение: os.sys.executable, '-c',; порядок аргументов сохраняется. os.sys.executable, '-c', # Задаёт 'import ctypes,sys; r по выражению справа; значение используется последующими операциями. 'import ctypes,sys; r=ctypes.CDLL(sys.argv[1]).run_tests(); ' # Задаёт 'print("PASS" if r по выражению справа; значение используется последующими операциями. 'print("PASS" if r==0 else f"FAIL: C line {r}"); sys.exit(bool(r))', # Продолжает текущий вызов, список или выражение: str(library),; порядок аргументов сохраняется. str(library), # Задаёт ], check по выражению справа; значение используется последующими операциями. ], check=True)