Refactor env.sh to improve registration and unregistration handling for toolchain environment

This commit is contained in:
2026-02-16 16:07:15 +03:00
parent 8b4a75b42d
commit b1421bf4ae
2 changed files with 111 additions and 48 deletions

View File

@@ -8,7 +8,7 @@ INSTALL_DIR="${TOP}/build/install"
INSTALL_BIN_DIR="${INSTALL_DIR}/bin" INSTALL_BIN_DIR="${INSTALL_DIR}/bin"
# Запускаем предварительно для того чтобы подтянуть переменные # Запускаем предварительно для того чтобы подтянуть переменные
. ./env.sh "${INSTALL_BIN_DIR}" . ./env.sh --register "${INSTALL_BIN_DIR}"
# Сбрасываем CFLAGS/CXXFLAGS — все флаги уже встроены в CC/CXX # Сбрасываем CFLAGS/CXXFLAGS — все флаги уже встроены в CC/CXX
export CFLAGS="" export CFLAGS=""
@@ -76,7 +76,7 @@ echo "== Распаковка завершена =="
# ================================================================== # ==================================================================
cd ${TOP} cd ${TOP}
. ./env.sh "${INSTALL_BIN_DIR}" "rc" . ./env.sh --register "${INSTALL_BIN_DIR}" "rc"
export CFLAGS="" export CFLAGS=""
export CXXFLAGS="" export CXXFLAGS=""
@@ -88,7 +88,7 @@ make install
# ================================================================== # ==================================================================
cd ${TOP} cd ${TOP}
. ./env.sh "${INSTALL_BIN_DIR}" . ./env.sh --register "${INSTALL_BIN_DIR}"
export CFLAGS="" export CFLAGS=""
export CXXFLAGS="" export CXXFLAGS=""
@@ -167,4 +167,9 @@ cmake -S .. -B . \
-DZLIB_USE_STATIC=ON -DZLIB_USE_STATIC=ON
make -j$(nproc) make -j$(nproc)
make install make install
# ==================================================================
cd ${TOP}
. ./env.sh --unregister

146
env.sh
View File

@@ -1,54 +1,112 @@
#!/bin/bash #!/bin/bash
# env.sh — окружение для сборки под arm-uclinuxfdpiceabi (FDPIC, thumb) # env.sh — окружение для сборки под arm-uclinuxfdpiceabi (FDPIC, thumb)
#
# Использование:
# . ./env.sh --register /path/to/bin [arflags]
# . ./env.sh --unregister
TOP="$(pwd)" _env_usage() {
TARGET=arm-uclinuxfdpiceabi echo "Использование:"
TOOLCHAIN=arm-uclinuxfdpiceabi echo " . ./env.sh --register /path/to/bin [arflags]"
echo " . ./env.sh --unregister"
}
# Если передали путь — используем его, иначе берём bin в текущей папке _env_register() {
# Пример вызова: ./env.sh /opt/toolchains/arm/bin local toolchain_path="${1:-}"
TOOLCHAIN_PATH="${1:-${TOP}/${TARGET}/bin}" local arflags_target="${2:-}"
SYSROOT="${TOOLCHAIN_ROOT}/sysroot" # Если путь не указан — пробуем найти локальную папку тулчейна
PREFIX="${SYSROOT}/usr" if [ -z "$toolchain_path" ]; then
local default_path="$(pwd)/arm-uclinuxfdpiceabi/bin"
if [ -d "$default_path" ]; then
toolchain_path="$default_path"
echo "Путь не указан, используется: ${default_path}"
else
echo "Ошибка: не указан путь к тулчейну и папка arm-uclinuxfdpiceabi/bin не найдена"
_env_usage
return 1
fi
fi
# Флаги тулчейна TOP="$(pwd)"
CFLAGS_TOOLSET='-O2' TARGET=arm-uclinuxfdpiceabi
ARFLAGS_TARGET="${2:-}" TOOLCHAIN=arm-uclinuxfdpiceabi
CFLAGS_TARGET='-Os -mthumb' TOOLCHAIN_PATH="$toolchain_path"
CXXFLAGS_TARGET=$CFLAGS_TARGET
LDFLAGS_TARGET='-Wl,--fdpic'
# Указание полного пути к компиляторам SYSROOT="${TOOLCHAIN_ROOT}/sysroot"
CC="${TOOLCHAIN_PATH}/${TOOLCHAIN}-gcc ${CFLAGS_TOOLSET} ${CFLAGS_TARGET}" PREFIX="${SYSROOT}/usr"
CXX="${TOOLCHAIN_PATH}/${TOOLCHAIN}-g++ ${CFLAGS_TOOLSET} ${CXXFLAGS_TARGET}"
CPP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-cpp"
LD="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ld"
AR="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ar"
ARFLAGS="${ARFLAGS_TARGET}"
AS="${TOOLCHAIN_PATH}/${TOOLCHAIN}-as"
NM="${TOOLCHAIN_PATH}/${TOOLCHAIN}-nm"
RANLIB="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ranlib"
STRIP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-strip"
OBJCOPY="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objcopy"
OBJDUMP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objdump"
# PATH — toolchain/bin должен быть в начале # Флаги тулчейна
PATH="${TOOLCHAIN_PATH}:${PATH}" CFLAGS_TOOLSET='-O2'
CFLAGS_TARGET='-Os -mthumb'
CXXFLAGS_TARGET=$CFLAGS_TARGET
LDFLAGS_TARGET='-Wl,--fdpic'
# Экспорт # Указание полного пути к компиляторам
export SYSROOT CC="${TOOLCHAIN_PATH}/${TOOLCHAIN}-gcc ${CFLAGS_TOOLSET} ${CFLAGS_TARGET}"
export PREFIX CXX="${TOOLCHAIN_PATH}/${TOOLCHAIN}-g++ ${CFLAGS_TOOLSET} ${CXXFLAGS_TARGET}"
export TARGET CPP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-cpp"
export TOOLCHAIN LD="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ld"
export CC CXX CPP LD AR ARFLAGS AS NM RANLIB STRIP OBJCOPY OBJDUMP AR="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ar"
export CFLAGS CXXFLAGS LDFLAGS ARFLAGS="${arflags_target}"
export CFLAGS_FOR_TARGET CXXFLAGS_FOR_TARGET LDFLAGS_FOR_TARGET AS="${TOOLCHAIN_PATH}/${TOOLCHAIN}-as"
export PATH NM="${TOOLCHAIN_PATH}/${TOOLCHAIN}-nm"
export SUBARCH=armv7-m RANLIB="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ranlib"
export SUBMODE=thumb STRIP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-strip"
OBJCOPY="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objcopy"
OBJDUMP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objdump"
echo "Окружение для ${TARGET} (Thumb/FDPIC) активировано" # Сохраняем оригинальный PATH (только при первой регистрации)
echo " TOOLCHAIN_PATH = $TOOLCHAIN_PATH" if [ -z "${_ENV_ORIG_PATH:-}" ]; then
echo " CC = $CC" _ENV_ORIG_PATH="$PATH"
echo " CXX = $CXX" fi
# PATH — toolchain/bin должен быть в начале
PATH="${TOOLCHAIN_PATH}:${_ENV_ORIG_PATH}"
# Экспорт
export SYSROOT PREFIX TARGET TOOLCHAIN
export CC CXX CPP LD AR ARFLAGS AS NM RANLIB STRIP OBJCOPY OBJDUMP
export CFLAGS CXXFLAGS LDFLAGS
export CFLAGS_FOR_TARGET CXXFLAGS_FOR_TARGET LDFLAGS_FOR_TARGET
export PATH
export SUBARCH=armv7-m
export SUBMODE=thumb
echo "Окружение для ${TARGET} (Thumb/FDPIC) активировано"
echo " TOOLCHAIN_PATH = $TOOLCHAIN_PATH"
echo " CC = $CC"
echo " CXX = $CXX"
}
_env_unregister() {
# Восстанавливаем PATH
if [ -n "${_ENV_ORIG_PATH:-}" ]; then
PATH="$_ENV_ORIG_PATH"
export PATH
unset _ENV_ORIG_PATH
fi
# Снимаем все экспортированные переменные
unset SYSROOT PREFIX TARGET TOOLCHAIN
unset CC CXX CPP LD AR ARFLAGS AS NM RANLIB STRIP OBJCOPY OBJDUMP
unset CFLAGS CXXFLAGS LDFLAGS
unset CFLAGS_FOR_TARGET CXXFLAGS_FOR_TARGET LDFLAGS_FOR_TARGET
unset SUBARCH SUBMODE
unset TOOLCHAIN_PATH CFLAGS_TOOLSET CFLAGS_TARGET CXXFLAGS_TARGET LDFLAGS_TARGET
echo "Окружение деактивировано, PATH восстановлен"
}
case "${1:-}" in
--register)
shift
_env_register "$@"
;;
--unregister)
_env_unregister
;;
*)
_env_usage
;;
esac