mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-03 13:26:56 +03:00
fbt/ufbt: Ensure POSIX paths are passed to GDB on all platforms (#3360)
* fbt/ufbt: Ensure POSIX paths are passed to GDB on all platforms GDB heavily dislikes forward slashes from Windows paths and strips them internally instead of normalizing them. Account for this by passing POSIX paths explicitly. * fbt: different approach for posix path handling * fbt, ufbt: further fixes for path handling * fbt: explicit path stringification * linter fixes Co-authored-by: hedger <hedger@users.noreply.github.com> Co-authored-by: hedger <hedger@nanode.su> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
parent
0c465f7eb3
commit
4039ccbcca
@ -230,7 +230,6 @@ firmware_debug = distenv.PhonyTarget(
|
|||||||
source=firmware_env["FW_ELF"],
|
source=firmware_env["FW_ELF"],
|
||||||
GDBOPTS="${GDBOPTS_BASE}",
|
GDBOPTS="${GDBOPTS_BASE}",
|
||||||
GDBREMOTE="${OPENOCD_GDB_PIPE}",
|
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)
|
distenv.Depends(firmware_debug, firmware_flash)
|
||||||
|
|
||||||
@ -240,7 +239,6 @@ distenv.PhonyTarget(
|
|||||||
source=firmware_env["FW_ELF"],
|
source=firmware_env["FW_ELF"],
|
||||||
GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}",
|
GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}",
|
||||||
GDBREMOTE="${BLACKMAGIC_ADDR}",
|
GDBREMOTE="${BLACKMAGIC_ADDR}",
|
||||||
FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(firmware_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Debug alien elf
|
# Debug alien elf
|
||||||
|
@ -3,6 +3,7 @@ import re
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
from pathlib import Path, PurePosixPath
|
||||||
|
|
||||||
import SCons
|
import SCons
|
||||||
from SCons.Errors import StopError
|
from SCons.Errors import StopError
|
||||||
@ -82,6 +83,27 @@ def resolve_real_dir_node(node):
|
|||||||
raise StopError(f"Can't find absolute path for {node.name} ({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):
|
def path_as_posix(path):
|
||||||
if SCons.Platform.platform_default() == "win32":
|
if SCons.Platform.platform_default() == "win32":
|
||||||
return path.replace(os.path.sep, os.path.altsep)
|
return path.replace(os.path.sep, os.path.altsep)
|
||||||
|
@ -18,7 +18,7 @@ def GetDevices(env):
|
|||||||
def generate(env, **kw):
|
def generate(env, **kw):
|
||||||
env.AddMethod(GetDevices)
|
env.AddMethod(GetDevices)
|
||||||
env.SetDefault(
|
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":
|
if (adapter_serial := env.subst("$SWD_TRANSPORT_SERIAL")) != "auto":
|
||||||
@ -36,11 +36,11 @@ def generate(env, **kw):
|
|||||||
|
|
||||||
env.SetDefault(
|
env.SetDefault(
|
||||||
OPENOCD_GDB_PIPE=[
|
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=[
|
GDBOPTS_BASE=[
|
||||||
"-ex",
|
"-ex",
|
||||||
"source ${FBT_DEBUG_DIR}/gdbinit",
|
"source ${POSIXPATH('$FBT_DEBUG_DIR')}/gdbinit",
|
||||||
"-ex",
|
"-ex",
|
||||||
"target extended-remote ${GDBREMOTE}",
|
"target extended-remote ${GDBREMOTE}",
|
||||||
],
|
],
|
||||||
@ -57,17 +57,17 @@ def generate(env, **kw):
|
|||||||
],
|
],
|
||||||
GDBPYOPTS=[
|
GDBPYOPTS=[
|
||||||
"-ex",
|
"-ex",
|
||||||
"source ${FBT_DEBUG_DIR}/FreeRTOS/FreeRTOS.py",
|
"source ${POSIXPATH('$FBT_DEBUG_DIR')}/FreeRTOS/FreeRTOS.py",
|
||||||
"-ex",
|
"-ex",
|
||||||
"source ${FBT_DEBUG_DIR}/flipperapps.py",
|
"source ${POSIXPATH('$FBT_DEBUG_DIR')}/flipperapps.py",
|
||||||
"-ex",
|
"-ex",
|
||||||
"source ${FBT_DEBUG_DIR}/flipperversion.py",
|
"source ${POSIXPATH('$FBT_DEBUG_DIR')}/flipperversion.py",
|
||||||
"-ex",
|
"-ex",
|
||||||
"fap-set-debug-elf-root ${FBT_FAP_DEBUG_ELF_ROOT}",
|
"fap-set-debug-elf-root ${POSIXPATH('$FBT_FAP_DEBUG_ELF_ROOT')}",
|
||||||
"-ex",
|
"-ex",
|
||||||
"source ${FBT_DEBUG_DIR}/PyCortexMDebug/PyCortexMDebug.py",
|
"source ${POSIXPATH('$FBT_DEBUG_DIR')}/PyCortexMDebug/PyCortexMDebug.py",
|
||||||
"-ex",
|
"-ex",
|
||||||
"svd_load ${SVD_FILE}",
|
"svd_load ${POSIXPATH('$SVD_FILE')}",
|
||||||
"-ex",
|
"-ex",
|
||||||
"compare-sections",
|
"compare-sections",
|
||||||
"-ex",
|
"-ex",
|
||||||
|
@ -6,7 +6,7 @@ import shutil
|
|||||||
|
|
||||||
from fbt.sdk.cache import SdkCache
|
from fbt.sdk.cache import SdkCache
|
||||||
from fbt.sdk.collector import SdkCollector
|
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.Action import Action
|
||||||
from SCons.Builder import Builder
|
from SCons.Builder import Builder
|
||||||
from SCons.Errors import UserError
|
from SCons.Errors import UserError
|
||||||
@ -80,7 +80,7 @@ class SdkMeta:
|
|||||||
vars,
|
vars,
|
||||||
target=Entry(self.MAP_FILE_SUBST),
|
target=Entry(self.MAP_FILE_SUBST),
|
||||||
)
|
)
|
||||||
return path_as_posix(expanded_vars)
|
return PosixPathWrapper.fixup_separators(expanded_vars)
|
||||||
|
|
||||||
|
|
||||||
class SdkTreeBuilder:
|
class SdkTreeBuilder:
|
||||||
@ -149,7 +149,7 @@ class SdkTreeBuilder:
|
|||||||
meta.save_to(self.target[0].path)
|
meta.save_to(self.target[0].path)
|
||||||
|
|
||||||
def build_sdk_file_path(self, orig_path: str) -> str:
|
def build_sdk_file_path(self, orig_path: str) -> str:
|
||||||
return path_as_posix(
|
return PosixPathWrapper.fix_path(
|
||||||
posixpath.normpath(
|
posixpath.normpath(
|
||||||
posixpath.join(
|
posixpath.join(
|
||||||
self.SDK_DIR_SUBST,
|
self.SDK_DIR_SUBST,
|
||||||
|
@ -47,7 +47,7 @@ from fbt.appmanifest import FlipperApplication, FlipperAppType
|
|||||||
from fbt.sdk.cache import SdkCache
|
from fbt.sdk.cache import SdkCache
|
||||||
from fbt.util import (
|
from fbt.util import (
|
||||||
FORWARDED_ENV_VARIABLES,
|
FORWARDED_ENV_VARIABLES,
|
||||||
path_as_posix,
|
PosixPathWrapper,
|
||||||
resolve_real_dir_node,
|
resolve_real_dir_node,
|
||||||
single_quote,
|
single_quote,
|
||||||
tempfile_arg_esc_func,
|
tempfile_arg_esc_func,
|
||||||
@ -89,6 +89,7 @@ env = core_env.Clone(
|
|||||||
("compilation_db", {"COMPILATIONDB_COMSTR": "\tCDB\t${TARGET}"}),
|
("compilation_db", {"COMPILATIONDB_COMSTR": "\tCDB\t${TARGET}"}),
|
||||||
],
|
],
|
||||||
FBT_FAP_DEBUG_ELF_ROOT=ufbt_build_dir,
|
FBT_FAP_DEBUG_ELF_ROOT=ufbt_build_dir,
|
||||||
|
POSIXPATH=PosixPathWrapper,
|
||||||
TEMPFILE=TempFileMunge,
|
TEMPFILE=TempFileMunge,
|
||||||
MAXLINELENGTH=2048,
|
MAXLINELENGTH=2048,
|
||||||
PROGSUFFIX=".elf",
|
PROGSUFFIX=".elf",
|
||||||
@ -128,7 +129,7 @@ dist_env = env.Clone(
|
|||||||
"-c",
|
"-c",
|
||||||
"transport select hla_swd",
|
"transport select hla_swd",
|
||||||
"-f",
|
"-f",
|
||||||
"${FBT_DEBUG_DIR}/stm32wbx.cfg",
|
"${POSIXPATH('$FBT_DEBUG_DIR')}/stm32wbx.cfg",
|
||||||
"-c",
|
"-c",
|
||||||
"stm32wbx.cpu configure -rtos auto",
|
"stm32wbx.cpu configure -rtos auto",
|
||||||
],
|
],
|
||||||
@ -161,7 +162,6 @@ firmware_debug = dist_env.PhonyTarget(
|
|||||||
source=dist_env["FW_ELF"],
|
source=dist_env["FW_ELF"],
|
||||||
GDBOPTS="${GDBOPTS_BASE}",
|
GDBOPTS="${GDBOPTS_BASE}",
|
||||||
GDBREMOTE="${OPENOCD_GDB_PIPE}",
|
GDBREMOTE="${OPENOCD_GDB_PIPE}",
|
||||||
FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(dist_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
dist_env.PhonyTarget(
|
dist_env.PhonyTarget(
|
||||||
@ -170,15 +170,14 @@ dist_env.PhonyTarget(
|
|||||||
source=dist_env["FW_ELF"],
|
source=dist_env["FW_ELF"],
|
||||||
GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}",
|
GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}",
|
||||||
GDBREMOTE="${BLACKMAGIC_ADDR}",
|
GDBREMOTE="${BLACKMAGIC_ADDR}",
|
||||||
FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(dist_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Debug alien elf
|
# Debug alien elf
|
||||||
debug_other_opts = [
|
debug_other_opts = [
|
||||||
"-ex",
|
"-ex",
|
||||||
"source ${FBT_DEBUG_DIR}/PyCortexMDebug/PyCortexMDebug.py",
|
"source ${POSIXPATH('FBT_DEBUG_DIR')}/PyCortexMDebug/PyCortexMDebug.py",
|
||||||
"-ex",
|
"-ex",
|
||||||
"source ${FBT_DEBUG_DIR}/flipperversion.py",
|
"source ${POSIXPATH('FBT_DEBUG_DIR')}/flipperversion.py",
|
||||||
"-ex",
|
"-ex",
|
||||||
"fw-version",
|
"fw-version",
|
||||||
]
|
]
|
||||||
@ -371,10 +370,6 @@ dist_env.PhonyTarget(
|
|||||||
|
|
||||||
|
|
||||||
# Prepare vscode environment
|
# Prepare vscode environment
|
||||||
def _path_as_posix(path):
|
|
||||||
return pathlib.Path(path).as_posix()
|
|
||||||
|
|
||||||
|
|
||||||
vscode_dist = []
|
vscode_dist = []
|
||||||
project_template_dir = dist_env["UFBT_SCRIPT_ROOT"].Dir("project_template")
|
project_template_dir = dist_env["UFBT_SCRIPT_ROOT"].Dir("project_template")
|
||||||
for template_file in project_template_dir.Dir(".vscode").glob("*"):
|
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(
|
"@UFBT_TOOLCHAIN_ARM_TOOLCHAIN_DIR@": pathlib.Path(
|
||||||
dist_env.WhereIs("arm-none-eabi-gcc")
|
dist_env.WhereIs("arm-none-eabi-gcc")
|
||||||
).parent.as_posix(),
|
).parent.as_posix(),
|
||||||
"@UFBT_TOOLCHAIN_GCC@": _path_as_posix(
|
"@UFBT_TOOLCHAIN_GCC@": PosixPathWrapper.fix_path(
|
||||||
dist_env.WhereIs("arm-none-eabi-gcc")
|
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")
|
dist_env.WhereIs("arm-none-eabi-gdb-py3")
|
||||||
),
|
),
|
||||||
"@UFBT_TOOLCHAIN_OPENOCD@": _path_as_posix(dist_env.WhereIs("openocd")),
|
"@UFBT_TOOLCHAIN_OPENOCD@": PosixPathWrapper.fix_path(
|
||||||
"@UFBT_APP_DIR@": _path_as_posix(original_app_dir.abspath),
|
dist_env.WhereIs("openocd")
|
||||||
"@UFBT_ROOT_DIR@": _path_as_posix(Dir("#").abspath),
|
),
|
||||||
"@UFBT_DEBUG_DIR@": _path_as_posix(dist_env["FBT_DEBUG_DIR"].abspath),
|
"@UFBT_APP_DIR@": PosixPathWrapper.fix_path(original_app_dir.abspath),
|
||||||
"@UFBT_DEBUG_ELF_DIR@": _path_as_posix(
|
"@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
|
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
|
||||||
|
),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -3,6 +3,7 @@ import os
|
|||||||
|
|
||||||
from fbt.util import (
|
from fbt.util import (
|
||||||
FORWARDED_ENV_VARIABLES,
|
FORWARDED_ENV_VARIABLES,
|
||||||
|
PosixPathWrapper,
|
||||||
resolve_real_dir_node,
|
resolve_real_dir_node,
|
||||||
single_quote,
|
single_quote,
|
||||||
tempfile_arg_esc_func,
|
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):
|
if environ_value := os.environ.get(env_value_name, None):
|
||||||
forward_os_env[env_value_name] = environ_value
|
forward_os_env[env_value_name] = environ_value
|
||||||
|
|
||||||
|
|
||||||
coreenv = VAR_ENV.Clone(
|
coreenv = VAR_ENV.Clone(
|
||||||
tools=[
|
tools=[
|
||||||
"fbt_tweaks",
|
"fbt_tweaks",
|
||||||
@ -43,6 +43,7 @@ coreenv = VAR_ENV.Clone(
|
|||||||
"ccache",
|
"ccache",
|
||||||
],
|
],
|
||||||
TEMPFILE=TempFileMunge,
|
TEMPFILE=TempFileMunge,
|
||||||
|
POSIXPATH=PosixPathWrapper,
|
||||||
MAXLINELENGTH=2048,
|
MAXLINELENGTH=2048,
|
||||||
PROGSUFFIX=".elf",
|
PROGSUFFIX=".elf",
|
||||||
ENV=forward_os_env,
|
ENV=forward_os_env,
|
||||||
|
Loading…
Reference in New Issue
Block a user