#!/bin/bash # env.sh — окружение для сборки под arm-uclinuxfdpiceabi (FDPIC, thumb) # # Использование: # . ./env.sh --toolchain --register /path/to/install [arflags] # . ./env.sh --toolchain --unregister _env_usage() { echo "Использование:" echo " . ./env.sh" echo " . ./env.sh --toolchain --register /path/to/install [arflags]" echo " . ./env.sh --toolchain --unregister" } _env_register() { local install_root="${1:-}" local arflags_target="${2:-}" # Если путь не указан — пробуем найти локальную папку тулчейна if [ -z "$install_root" ]; then local default_path="$(pwd)/arm-uclinuxfdpiceabi" if [ -d "$default_path" ]; then install_root="$default_path" echo "Путь не указан, используется: ${default_path}" else echo "Ошибка: не указан путь к тулчейну и папка arm-uclinuxfdpiceabi не найдена" _env_usage return 1 fi fi TOP="$(pwd)" TARGET=arm-uclinuxfdpiceabi TOOLCHAIN=arm-uclinuxfdpiceabi TOOLCHAIN_PATH="${install_root}/bin" SYSROOT="${install_root}/sysroot" PREFIX="${SYSROOT}/usr" # Флаги тулчейна CFLAGS_TOOLSET='-O2' CFLAGS_TARGET='-Os -mthumb' CXXFLAGS_TARGET=$CFLAGS_TARGET LDFLAGS_TARGET='-Wl,--fdpic' # Указание полного пути к компиляторам CC="${TOOLCHAIN_PATH}/${TOOLCHAIN}-gcc ${CFLAGS_TOOLSET} ${CFLAGS_TARGET}" 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 (только при первой регистрации) if [ -z "${_ENV_ORIG_PATH:-}" ]; then _ENV_ORIG_PATH="$PATH" 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 восстановлен" } if [ $# -eq 0 ]; then TOP="$(pwd)" TARGET="arm-uclinuxfdpiceabi" TOOLCHAIN="${TARGET}" TOOLCHAIN_PATH="${TOP}/${TARGET}/bin" CFLAGS_TOOLSET='-O2' CFLAGS_TARGET='-Os -mthumb' if [ -z "${_ENV_ORIG_PATH:-}" ]; then _ENV_ORIG_PATH="$PATH" fi CFLAGS="${CFLAGS_TOOLSET}" CFLAGS_FOR_TARGET="${CFLAGS_TARGET}" CXXFLAGS_FOR_TARGET="${CFLAGS_TARGET}" PATH="${TOOLCHAIN_PATH}:${_ENV_ORIG_PATH}" SUBARCH=armv7-m SUBMODE=thumb echo "Окружение по умолчанию активировано" echo " TOP = $TOP" echo " TARGET = $TARGET" return 0 2>/dev/null || exit 0 fi if [ "${1:-}" != "--toolchain" ]; then _env_usage return 1 2>/dev/null || exit 1 fi shift case "${1:-}" in --register) shift _env_register "$@" ;; --unregister) _env_unregister ;; *) _env_usage ;; esac