From 6d9a2cc6994dedb6ffce8008463bafd57260b1b6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 22 Mar 2024 11:27:02 +0300 Subject: [PATCH] fbt/ufbt: Ensure POSIX paths are passed to GDB on all platforms https://github.com/flipperdevices/flipperzero-firmware/pull/3360/files --- SConstruct | 2 -- scripts/fbt/util.py | 25 +++++++++++++++++++++ scripts/fbt_tools/fbt_debugopts.py | 18 +++++++-------- scripts/fbt_tools/fbt_sdk.py | 6 ++--- scripts/ufbt/SConstruct | 35 +++++++++++++++--------------- site_scons/environ.scons | 3 ++- 6 files changed, 56 insertions(+), 33 deletions(-) diff --git a/SConstruct b/SConstruct index be107eeb1..52d286953 100644 --- a/SConstruct +++ b/SConstruct @@ -229,7 +229,6 @@ firmware_debug = distenv.PhonyTarget( source=firmware_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE}", GDBREMOTE="${OPENOCD_GDB_PIPE}", - FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(firmware_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), ) distenv.Depends(firmware_debug, firmware_flash) @@ -239,7 +238,6 @@ distenv.PhonyTarget( source=firmware_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}", GDBREMOTE="${BLACKMAGIC_ADDR}", - FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(firmware_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), ) # Debug alien elf diff --git a/scripts/fbt/util.py b/scripts/fbt/util.py index 6b1f9dc6c..f08c8f4fa 100644 --- a/scripts/fbt/util.py +++ b/scripts/fbt/util.py @@ -1,5 +1,9 @@ import os import re +import subprocess +import sys +import webbrowser +from pathlib import Path, PurePosixPath import SCons from SCons.Errors import StopError @@ -80,6 +84,27 @@ def resolve_real_dir_node(node): raise StopError(f"Can't find absolute path for {node.name} ({node})") +class PosixPathWrapper: + def __init__(self, pathobj): + self.pathobj = pathobj + + @staticmethod + def fixup_separators(path): + if SCons.Platform.platform_default() == "win32": + return path.replace(os.path.sep, os.path.altsep) + return path + + @staticmethod + def fix_path(path): + return str(PurePosixPath(Path(path).as_posix())) + + def __call__(self, target, source, env, for_signature): + if for_signature: + return self.pathobj + + return self.fix_path(env.subst(self.pathobj)) + + def path_as_posix(path): if SCons.Platform.platform_default() == "win32": return path.replace(os.path.sep, os.path.altsep) diff --git a/scripts/fbt_tools/fbt_debugopts.py b/scripts/fbt_tools/fbt_debugopts.py index 392465a51..77b63e203 100644 --- a/scripts/fbt_tools/fbt_debugopts.py +++ b/scripts/fbt_tools/fbt_debugopts.py @@ -18,7 +18,7 @@ def GetDevices(env): def generate(env, **kw): env.AddMethod(GetDevices) env.SetDefault( - FBT_DEBUG_DIR="${FBT_SCRIPT_DIR}/debug", + FBT_DEBUG_DIR="${POSIXPATH('$FBT_SCRIPT_DIR')}/debug", ) if (adapter_serial := env.subst("$SWD_TRANSPORT_SERIAL")) != "auto": @@ -36,11 +36,11 @@ def generate(env, **kw): env.SetDefault( OPENOCD_GDB_PIPE=[ - "|openocd -c 'gdb_port pipe; log_output ${FBT_DEBUG_DIR}/openocd.log' ${[SINGLEQUOTEFUNC(OPENOCD_OPTS)]}" + "|openocd -c 'gdb_port pipe; log_output ${POSIXPATH('$FBT_DEBUG_DIR')}/openocd.log' ${[SINGLEQUOTEFUNC(OPENOCD_OPTS)]}" ], GDBOPTS_BASE=[ "-ex", - "source ${FBT_DEBUG_DIR}/gdbinit", + "source ${POSIXPATH('$FBT_DEBUG_DIR')}/gdbinit", "-ex", "target extended-remote ${GDBREMOTE}", ], @@ -57,17 +57,17 @@ def generate(env, **kw): ], GDBPYOPTS=[ "-ex", - "source ${FBT_DEBUG_DIR}/FreeRTOS/FreeRTOS.py", + "source ${POSIXPATH('$FBT_DEBUG_DIR')}/FreeRTOS/FreeRTOS.py", "-ex", - "source ${FBT_DEBUG_DIR}/flipperapps.py", + "source ${POSIXPATH('$FBT_DEBUG_DIR')}/flipperapps.py", "-ex", - "source ${FBT_DEBUG_DIR}/flipperversion.py", + "source ${POSIXPATH('$FBT_DEBUG_DIR')}/flipperversion.py", "-ex", - "fap-set-debug-elf-root ${FBT_FAP_DEBUG_ELF_ROOT}", + "fap-set-debug-elf-root ${POSIXPATH('$FBT_FAP_DEBUG_ELF_ROOT')}", "-ex", - "source ${FBT_DEBUG_DIR}/PyCortexMDebug/PyCortexMDebug.py", + "source ${POSIXPATH('$FBT_DEBUG_DIR')}/PyCortexMDebug/PyCortexMDebug.py", "-ex", - "svd_load ${SVD_FILE}", + "svd_load ${POSIXPATH('$SVD_FILE')}", "-ex", "compare-sections", "-ex", diff --git a/scripts/fbt_tools/fbt_sdk.py b/scripts/fbt_tools/fbt_sdk.py index 17acc8cf1..a3f7faa57 100644 --- a/scripts/fbt_tools/fbt_sdk.py +++ b/scripts/fbt_tools/fbt_sdk.py @@ -6,7 +6,7 @@ import shutil from fbt.sdk.cache import SdkCache from fbt.sdk.collector import SdkCollector -from fbt.util import path_as_posix +from fbt.util import PosixPathWrapper from SCons.Action import Action from SCons.Builder import Builder from SCons.Errors import UserError @@ -80,7 +80,7 @@ class SdkMeta: vars, target=Entry(self.MAP_FILE_SUBST), ) - return path_as_posix(expanded_vars) + return PosixPathWrapper.fixup_separators(expanded_vars) class SdkTreeBuilder: @@ -149,7 +149,7 @@ class SdkTreeBuilder: meta.save_to(self.target[0].path) def build_sdk_file_path(self, orig_path: str) -> str: - return path_as_posix( + return PosixPathWrapper.fix_path( posixpath.normpath( posixpath.join( self.SDK_DIR_SUBST, diff --git a/scripts/ufbt/SConstruct b/scripts/ufbt/SConstruct index 8178a83da..11fefd22b 100644 --- a/scripts/ufbt/SConstruct +++ b/scripts/ufbt/SConstruct @@ -47,7 +47,7 @@ from fbt.appmanifest import FlipperApplication, FlipperAppType from fbt.sdk.cache import SdkCache from fbt.util import ( FORWARDED_ENV_VARIABLES, - path_as_posix, + PosixPathWrapper, resolve_real_dir_node, single_quote, tempfile_arg_esc_func, @@ -89,6 +89,7 @@ env = core_env.Clone( ("compilation_db", {"COMPILATIONDB_COMSTR": "\tCDB\t${TARGET}"}), ], FBT_FAP_DEBUG_ELF_ROOT=ufbt_build_dir, + POSIXPATH=PosixPathWrapper, TEMPFILE=TempFileMunge, MAXLINELENGTH=2048, PROGSUFFIX=".elf", @@ -128,7 +129,7 @@ dist_env = env.Clone( "-c", "transport select hla_swd", "-f", - "${FBT_DEBUG_DIR}/stm32wbx.cfg", + "${POSIXPATH('$FBT_DEBUG_DIR')}/stm32wbx.cfg", "-c", "stm32wbx.cpu configure -rtos auto", ], @@ -161,7 +162,6 @@ firmware_debug = dist_env.PhonyTarget( source=dist_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE}", GDBREMOTE="${OPENOCD_GDB_PIPE}", - FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(dist_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), ) dist_env.PhonyTarget( @@ -170,15 +170,14 @@ dist_env.PhonyTarget( source=dist_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}", GDBREMOTE="${BLACKMAGIC_ADDR}", - FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(dist_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), ) # Debug alien elf debug_other_opts = [ "-ex", - "source ${FBT_DEBUG_DIR}/PyCortexMDebug/PyCortexMDebug.py", + "source ${POSIXPATH('FBT_DEBUG_DIR')}/PyCortexMDebug/PyCortexMDebug.py", "-ex", - "source ${FBT_DEBUG_DIR}/flipperversion.py", + "source ${POSIXPATH('FBT_DEBUG_DIR')}/flipperversion.py", "-ex", "fw-version", ] @@ -371,10 +370,6 @@ dist_env.PhonyTarget( # Prepare vscode environment -def _path_as_posix(path): - return pathlib.Path(path).as_posix() - - vscode_dist = [] project_template_dir = dist_env["UFBT_SCRIPT_ROOT"].Dir("project_template") for template_file in project_template_dir.Dir(".vscode").glob("*"): @@ -387,20 +382,24 @@ for template_file in project_template_dir.Dir(".vscode").glob("*"): "@UFBT_TOOLCHAIN_ARM_TOOLCHAIN_DIR@": pathlib.Path( dist_env.WhereIs("arm-none-eabi-gcc") ).parent.as_posix(), - "@UFBT_TOOLCHAIN_GCC@": _path_as_posix( + "@UFBT_TOOLCHAIN_GCC@": PosixPathWrapper.fix_path( dist_env.WhereIs("arm-none-eabi-gcc") ), - "@UFBT_TOOLCHAIN_GDB_PY@": _path_as_posix( + "@UFBT_TOOLCHAIN_GDB_PY@": PosixPathWrapper.fix_path( dist_env.WhereIs("arm-none-eabi-gdb-py3") ), - "@UFBT_TOOLCHAIN_OPENOCD@": _path_as_posix(dist_env.WhereIs("openocd")), - "@UFBT_APP_DIR@": _path_as_posix(original_app_dir.abspath), - "@UFBT_ROOT_DIR@": _path_as_posix(Dir("#").abspath), - "@UFBT_DEBUG_DIR@": _path_as_posix(dist_env["FBT_DEBUG_DIR"].abspath), - "@UFBT_DEBUG_ELF_DIR@": _path_as_posix( + "@UFBT_TOOLCHAIN_OPENOCD@": PosixPathWrapper.fix_path( + dist_env.WhereIs("openocd") + ), + "@UFBT_APP_DIR@": PosixPathWrapper.fix_path(original_app_dir.abspath), + "@UFBT_ROOT_DIR@": PosixPathWrapper.fix_path(Dir("#").abspath), + "@UFBT_DEBUG_DIR@": dist_env.subst("FBT_DEBUG_DIR"), + "@UFBT_DEBUG_ELF_DIR@": PosixPathWrapper.fix_path( dist_env["FBT_FAP_DEBUG_ELF_ROOT"].abspath ), - "@UFBT_FIRMWARE_ELF@": _path_as_posix(dist_env["FW_ELF"].abspath), + "@UFBT_FIRMWARE_ELF@": PosixPathWrapper.fix_path( + dist_env["FW_ELF"].abspath + ), }, ) ) diff --git a/site_scons/environ.scons b/site_scons/environ.scons index ece8de212..3f2d3450e 100644 --- a/site_scons/environ.scons +++ b/site_scons/environ.scons @@ -3,6 +3,7 @@ import os from fbt.util import ( FORWARDED_ENV_VARIABLES, + PosixPathWrapper, resolve_real_dir_node, single_quote, tempfile_arg_esc_func, @@ -26,7 +27,6 @@ for env_value_name in variables_to_forward: if environ_value := os.environ.get(env_value_name, None): forward_os_env[env_value_name] = environ_value - coreenv = VAR_ENV.Clone( tools=[ "fbt_tweaks", @@ -43,6 +43,7 @@ coreenv = VAR_ENV.Clone( "ccache", ], TEMPFILE=TempFileMunge, + POSIXPATH=PosixPathWrapper, MAXLINELENGTH=2048, PROGSUFFIX=".elf", ENV=forward_os_env,