Files
build_infra/cqwrteur/toolchainbuildscripts-main/gcc/build_common.sh
T
2026-06-29 16:16:11 +08:00

597 lines
21 KiB
Bash

#!/bin/bash
if [ -z ${HOST_TRIPLET+x} ]; then
echo "HOST_TRIPLET is not set. Please set the HOST_TRIPLET environment variable to the target triplet."
exit 1
fi
if [ -z ${TARGET_TRIPLET+x} ]; then
echo "TARGET_TRIPLET is not set. Please set the TARGET_TRIPLET environment variable to the target triplet."
exit 1
fi
artifactspath="$(realpath .)/.artifacts"
currentpathnohosttriplet="${artifactspath}/gcc"
currentpath="${currentpathnohosttriplet}/${HOST_TRIPLET}/${TARGET_TRIPLET}"
if [[ "x${GENERATE_CMAKE_ONLY}" == "xyes" ]]; then
SKIP_DEPENDENCY_CHECK=yes
fi
mkdir -p "$currentpath"
cd ../common
source ./common.sh
# Determine the number of CPU threads to use for the Ninja build
# Get the total number of logical CPU cores on the system
# Detect total logical CPU cores with fallback and verbose output
if command -v nproc >/dev/null 2>&1; then
echo "Using nproc to detect core count..."
TOTAL_CORES=$(nproc)
echo "Detected TOTAL_CORES = ${TOTAL_CORES}"
elif command -v sysctl >/dev/null 2>&1; then
echo "nproc not found, using sysctl instead..."
TOTAL_CORES=$(sysctl -n hw.logicalcpu)
echo "Detected TOTAL_CORES = ${TOTAL_CORES}"
fi
if [ -z "$TOTAL_CORES" ]; then
echo "Neither nproc nor sysctl succeeded, defaulting to 6 cores..."
TOTAL_CORES=6
fi
JOBS=${TOTAL_CORES}
# If NINJA_MAX_JOBS is explicitly set, use that value
if [[ -n "$NINJA_MAX_JOBS" ]]; then
JOBS="$NINJA_MAX_JOBS"
echo "📌 Using NINJA_MAX_JOBS=$JOBS"
# If REDUCE_BUILDING_POWER_FOR_TEMPERATURE is set, reduce thread count by half
elif [[ -n "$REDUCE_BUILDING_POWER_FOR_TEMPERATURE" ]]; then
JOBS=$((TOTAL_CORES / 2))
# Clamp JOBS to range [1, 4]
if [[ "$JOBS" -lt 1 ]]; then
JOBS=1
# elif [[ "$JOBS" -gt 4 ]]; then
# JOBS=4
fi
echo "🌞 REDUCE_BUILDING_POWER_FOR_TEMPERATURE detected — using $JOBS threads (half of $TOTAL_CORES)"
# Otherwise, use all available cores
else
echo "⚡ No throttling — using all $TOTAL_CORES threads"
fi
cd "$currentpath"
parse_triplet $HOST_TRIPLET HOST_CPU HOST_VENDOR HOST_OS HOST_ABI
if [ $? -ne 0 ]; then
echo "Failed to parse the host triplet: $HOST_TRIPLET"
exit 1
fi
if [[ "x$CLONE_IN_CHINA" == "xyes" ]]; then
echo "Clone in China enabled. We are going to use Chinese mirror first"
fi
if [[ "$HOST_OS" == mingw* ]]; then
HOST_TRIPLET=$HOST_CPU-windows-gnu
unset HOST_VENDOR
HOST_OS=windows
HOST_ABI=gnu
fi
if [[ "$HOST_OS" == windows && "$HOST_ABI" == gnu ]]; then
HOST_GCC_TRIPLET=$HOST_CPU-w64-mingw32
fi
if [ -z ${HOST_GCC_TRIPLET+x} ]; then
HOST_GCC_TRIPLET=$HOST_TRIPLET
fi
HOST_ABI_NO_VERSION="${HOST_ABI//[0-9]/}"
HOST_ABI_VERSION=${HOST_ABI//[!0-9]/}
echo "HOST_TRIPLET: $HOST_TRIPLET"
echo "HOST_CPU: $HOST_CPU"
echo "HOST_VENDOR: $HOST_VENDOR"
echo "HOST_OS: $HOST_OS"
echo "HOST_ABI: $HOST_ABI"
echo "HOST_ABI_NO_VERSION: $HOST_ABI_NO_VERSION"
echo "HOST_GCC_TRIPLET: $HOST_GCC_TRIPLET"
parse_triplet $TARGET_TRIPLET TARGET_CPU TARGET_VENDOR TARGET_OS TARGET_ABI
if [ $? -ne 0 ]; then
echo "Failed to parse the host triplet: $TARGET_TRIPLET"
exit 1
fi
if [[ "$TARGET_OS" == mingw* ]]; then
TARGET_TRIPLET=$TARGET_CPU-windows-gnu
unset TARGET_VENDOR
TARGET_OS=windows
TARGET_ABI=gnu
fi
if [[ "$TARGET_OS" == windows && "$TARGET_ABI" == gnu ]]; then
TARGET_TRIPLET=$TARGET_CPU-w64-mingw32
fi
if [ -z ${TARGET_GCC_TRIPLET+x} ]; then
TARGET_GCC_TRIPLET=$TARGET_TRIPLET
fi
TARGET_ABI_NO_VERSION="${TARGET_ABI//[0-9]/}"
TARGET_ABI_VERSION=${TARGET_ABI//[!0-9]/}
echo "TARGET_TRIPLET: $TARGET_TRIPLET"
echo "TARGET_CPU: $TARGET_CPU"
echo "TARGET_VENDOR: $TARGET_VENDOR"
echo "TARGET_OS: $TARGET_OS"
echo "TARGET_ABI: $TARGET_ABI"
echo "TARGET_GCC_TRIPLET: $TARGET_GCC_TRIPLET"
if [ -z ${TOOLCHAINS_BUILD+x} ]; then
TOOLCHAINS_BUILD="$HOME/toolchains_build"
fi
if [ -z ${TOOLCHAINS_BUILD_SHARED_STORAGE+x} ]; then
TOOLCHAINS_BUILD_SHARED_STORAGE="${TOOLCHAINS_BUILD}/.shared_storage"
fi
if [ -z ${TOOLCHAINSPATH+x} ]; then
TOOLCHAINSPATH="$HOME/toolchains"
fi
if [ -z ${TOOLCHAINSPATH_GNU+x} ]; then
TOOLCHAINSPATH_GNU="$TOOLCHAINSPATH/gnu"
fi
mkdir -p "${TOOLCHAINSPATH_GNU}"
if [ -z ${BUILD_TRIPLET+x} ]; then
if ! command -v gcc >/dev/null 2>&1; then
echo "failed to find gcc"
exit 1
fi
BUILD_TRIPLET="$(gcc -dumpmachine)"
BUILD_GCC_TRIPLET="$BUILD_TRIPLET"
fi
parse_triplet $BUILD_TRIPLET BUILD_CPU BUILD_VENDOR BUILD_OS BUILD_ABI
if [ $? -ne 0 ]; then
echo "Failed to parse the host triplet: $BUILD_TRIPLET"
exit 1
fi
if [[ "$BUILD_OS" == linux && "$BUILD_ABI" == gnu ]]; then
if ! command -v $BUILD_CPU-$BUILD_OS-$BUILD_ABI-gcc >/dev/null 2>&1; then
echo "failed to find $BUILD_CPU-$BUILD_OS-$BUILD_ABI-gcc"
exit 1
fi
BUILD_TRIPLET=$BUILD_CPU-$BUILD_OS-$BUILD_ABI
BUILD_VENDOR=
BUILD_GCC_TRIPLET=$BUILD_TRIPLET
fi
if [[ "$BUILD_OS" == windows && "$BUILD_ABI" == gnu ]]; then
BUILD_GCC_TRIPLET=$BUILD_CPU-w64-mingw32
fi
if [ -z ${BUILD_GCC_TRIPLET+x} ]; then
BUILD_GCC_TRIPLET=$BUILD_TRIPLET
fi
echo "BUILD_TRIPLET: $BUILD_TRIPLET"
echo "BUILD_CPU: $BUILD_CPU"
echo "BUILD_VENDOR: $BUILD_VENDOR"
echo "BUILD_OS: $BUILD_OS"
echo "BUILD_ABI: $BUILD_ABI"
echo "BUILD_GCC_TRIPLET: $BUILD_GCC_TRIPLET"
export PATH="${TOOLCHAINSPATH_GNU}/${BUILD_GCC_TRIPLET}/${HOST_GCC_TRIPLET}/bin:${TOOLCHAINSPATH_GNU}/${BUILD_GCC_TRIPLET}/${TARGET_GCC_TRIPLET}/bin:$PATH"
GCC_TWO_PHASE=0
# Check if NO_CLONE_OR_UPDATE is set to "yes"
if [ "$NO_CLONE_OR_UPDATE" != "yes" ]; then
clone_or_update_dependency binutils-gdb
clone_or_update_dependency gcc
else
echo "NO_CLONE_OR_UPDATE is set to 'yes'; skipping dependency clone/update."
fi
duplicating_runtimes()
{
local project_name="$1"
local build_prefix_project="$2"
local target_triplet="$3"
local sysroot_prefix="$4"
local duplicating_runtimes_phase_file=".${project_name}_duplicating_runtimes_phase"
# Skip if phase already completed
if [ -f "${build_prefix_project}/${duplicating_runtimes_phase_file}" ]; then
return 0
fi
mkdir -p "${sysroot_prefix}/runtimes" || {
echo "Error: Failed to create ${sysroot_prefix}/runtimes"
exit 1
}
# Step 1: Build whitelist from all files under GCC build root
local -A gcc_so_whitelist=()
local gcc_build_root="${build_prefix_project}/${target_triplet}"
while IFS= read -r entry; do
local fname="$(basename "$entry")"
gcc_so_whitelist["$fname"]=1
done < <(find "$gcc_build_root" -type f -o -type l)
# Step 2: Copy matching runtime files from sysroot_prefix/lib*
for libdir in "${sysroot_prefix}"/lib*; do
[ -d "${libdir}" ] || continue
[ "$(basename "${libdir}")" = "libexec" ] && continue
if [ "$(basename "${libdir}")" = "lib" ]; then
[ -d "${libdir}/gcc" ] && continue
[ -d "${libdir}/bfd-plugins" ] && continue
fi
mapfile -t all_named_files < <(find "${libdir}" -maxdepth 1)
local runtime_files=()
for f in "${all_named_files[@]}"; do
fname="$(basename "$f")"
if [[ -n "${gcc_so_whitelist[$fname]}" ]]; then
runtime_files+=("$f")
fi
done
if [ "${#runtime_files[@]}" -gt 0 ]; then
local target_dir="${sysroot_prefix}/runtimes/$(basename "${libdir}")"
mkdir -p "${target_dir}" || {
echo "Error: Failed to create ${target_dir}"
exit 1
}
cp -a "${runtime_files[@]}" "${target_dir}/" || {
echo "Error: Failed to copy files from ${libdir} to ${target_dir}"
exit 1
}
fi
done
# Step 3: Create lib → libXX symlink in runtimes if lib is missing
if [ ! -d "${sysroot_prefix}/runtimes/lib" ]; then
mkdir -p "${sysroot_prefix}/runtimes"
cd "${sysroot_prefix}/runtimes"
local best=""
local max=-1
for d in lib[0-9]*; do
[ -d "$d" ] || continue
local suffix="${d#lib}"
if [[ "$suffix" =~ ^[0-9]+$ ]]; then
if (( suffix > max )); then
max=$suffix
best="$d"
fi
fi
done
if [ -n "$best" ]; then
ln -s "$best" lib || {
echo "Error: Failed to create symlink lib → $best"
exit 1
}
fi
fi
# Step 4: Mark phase complete
echo "$(date +%s)" > "${build_prefix_project}/${duplicating_runtimes_phase_file}" || {
echo "Error: Failed to write phase completion file"
exit 1
}
}
build_project_gnu_cookie() {
local project_name=$1
local host_triplet=$2
local target_triplet=$3
local cookie=${4:-0}
local prefix="$TOOLCHAINSPATH_GNU/$2/$3"
local build_prefix="$currentpathnohosttriplet/$2/$3"
local configure_phase_file=".${project_name}_phase_configure"
local build_phase_file=".${project_name}_phase_build"
local build_all_gcc_phase_file=".${project_name}_all_gcc_phase_build"
local build_target_libgcc_phase_file=".${project_name}_build_target_libgcc_phase_build"
local install_gcc_phase_file=".${project_name}_install_gcc_phase_build"
local install_target_libgcc_phase_file=".${project_name}_install_target_libgcc_phase_build"
local generate_gcc_limits_phase_file=".${project_name}_generate_gcc_limits"
local install_phase_file=".${project_name}_phase_install"
local strip_phase_file=".${project_name}_phase_strip"
local current_phase_file=".${project_name}_phase_done"
local configure_project_name="$project_name"
local configures="--build=$BUILD_TRIPLET --host=$host_triplet --target=$target_triplet"
local multilibsettings="yes"
local is_native_or_canadian_native="no"
local is_native_cross="no"
local is_canadian_cross="no"
local libc_install_prefix="${TOOLCHAINSPATH_GNU}/${host_triplet}/${target_triplet}"
if [[ "$host_triplet" == "$target_triplet" ]]; then
is_native_or_canadian_native="yes"
else
libc_install_prefix="${libc_install_prefix}/${target_triplet}"
if [[ "$BUILD_TRIPLET" == "$host_triplet" ]] then
is_native_cross="yes"
else
is_canadian_cross="yes"
fi
fi
local is_freestanding_build="no"
local is_two_phase_build="no"
local is_freestanding_or_two_phase_build="no"
local is_between_build="no"
if [[ "x$project_name" == "xgcc" ]]; then
local target_cpu
local target_vendor
local target_os
local target_abi
parse_triplet $target_triplet target_cpu target_vendor target_os target_abi
if [[ $cookie -eq 0 ]];then
if [[ $target_os == "linux" && ( $target_abi == "gnu" || $target_abi == "musl" ) ]]; then
if [[ "x${is_native_cross}" == "xyes" ]]; then
is_two_phase_build="yes"
fi
is_freestanding_or_two_phase_build="$is_two_phase_build"
elif [[ $target_os == mingw* ]]; then
if [[ "x${is_native_cross}" == "xyes" ]]; then
is_between_build="yes"
fi
elif [[ $target_os == "elf" ]]; then
is_freestanding_build="yes"
is_freestanding_or_two_phase_build="${is_freestanding_build}"
else
install_libc "${TOOLCHAINS_BUILD_SHARED_STORAGE}" $host_triplet $target_triplet "${build_prefix}/libc" "${build_prefix}/install/libc" "${libc_install_prefix}" "no" "no" "${multilibsettings}" "${is_native_cross}" "yes"
fi
fi
local is_duplicating_runtime="yes"
if [[ "$target_os" =~ ^mingw ]] || [[ "$target_os" == "elf" ]] || [[ "$target_os" == "msdosdjgpp" ]]; then
is_duplicating_runtime="no"
fi
if [[ $is_freestanding_or_two_phase_build == "yes" ]];then
configures="$configures --disable-libstdcxx-verbose --enable-languages=c,c++ --disable-sjlj-exceptions --with-libstdcxx-eh-pool-obj-count=0 --disable-hosted-libstdcxx --without-headers --disable-threads --disable-shared --disable-libssp --disable-libquadmath --disable-libatomic --disable-libsanitizer"
if [[ $is_two_phase_build == "yes" ]]; then
configure_project_name="${configure_project_name}_phase1"
fi
else
configures="$configures --disable-libstdcxx-verbose --enable-languages=c,c++ --disable-sjlj-exceptions --with-libstdcxx-eh-pool-obj-count=0"
fi
if [[ "$target_os" == linux ]] || [[ "$target_os" =~ ^freebsd ]] ||
([[ "$target_cpu" =~ i[3-6]86 ]] && [[ "$target_os" =~ ^mingw ]]) ; then
# Disable multilib for *-linux-gnu and FreeBSD targets
configures="$configures --disable-multilib"
multilibsettings="no"
if [[ "$target_os" =~ ^mingw ]]; then
configures="$configures --disable-threads"
fi
if [[ "$target_os" == "linux" ]] && [[ "$target_cpu" =~ i[3-6]86 ]]; then
configures="$configures --disable-libsanitizer"
fi
elif [[ "$target_os" == "msdosdjgpp" ]]; then
# DJGPP doesn't support threads or libquadmath
configures="$configures --disable-threads --disable-libquadmath"
else
configures="$configures --enable-multilib"
fi
elif [[ "x$project_name" == "xbinutils-gdb" ]]; then
configures="$configures --disable-tui --without-debuginfod"
fi
local is_to_build_install_libc="no"
if [[ "x$project_name" == "xgcc" && "${is_freestanding_build}" != "yes" ]]; then
is_to_build_install_libc="yes"
fi
local build_prefix_project="$build_prefix/$configure_project_name"
local configure_env_vars=(
STRIP=llvm-strip
ac_cv_path_STRIP_FOR_TARGET=llvm-strip
)
if [[ "$BUILD_TRIPLET" == "$target_triplet" && "$BUILD_TRIPLET" != "$host_triplet" ]]; then
# Fix up the bug related to crossback since GCC would try to use cc instead of gcc which does not exist
configure_env_vars+=(CC_FOR_TARGET="${target_triplet}-gcc")
fi
if [ -f "${build_prefix_project}/${current_phase_file}" ]; then
if [[ "${is_two_phase_build}" == "yes" ]]; then
build_project_gnu_cookie $1 $2 $3 1
fi
return
fi
mkdir -p "$build_prefix_project"
if [ ! -f "${build_prefix_project}/${configure_phase_file}" ]; then
cd "$build_prefix_project"
env "${configure_env_vars[@]}" "$TOOLCHAINS_BUILD"/${project_name}/configure --disable-nls --disable-werror --disable-bootstrap --prefix="$prefix" $configures
if [ $? -ne 0 ]; then
echo "$configure_project_name: configure failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
echo "$(date +%s)" > "${build_prefix_project}/${configure_phase_file}"
fi
if [[ "x$project_name" == "xgcc" ]]; then
if [ ! -f "${build_prefix_project}/${build_all_gcc_phase_file}" ]; then
cd "$build_prefix_project"
make all-gcc -j "${JOBS}"
if [ $? -ne 0 ]; then
echo "$configure_project_name: make all-gcc failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
echo "$(date +%s)" > "${build_prefix_project}/${build_all_gcc_phase_file}"
fi
fi
if [[ "x$project_name" == "xgcc" && "x$is_freestanding_or_two_phase_build" == "xyes" ]]; then
cd "$build_prefix_project"
# freestanding should not deal with this?
# if [ ! -f "${build_prefix_project}/${generate_gcc_limits_phase_file}" ]; then
# cat "$TOOLCHAINS_BUILD/gcc/gcc/limitx.h" "$TOOLCHAINS_BUILD/gcc/gcc/glimits.h" "$TOOLCHAINS_BUILD/gcc/gcc/limity.h" > "${build_prefix_project}/gcc/include/limits.h"
# echo "$(date +%s)" > "${build_prefix_project}/${generate_gcc_limits_phase_file}"
# fi
if [ ! -f "${build_prefix_project}/${build_target_libgcc_phase_file}" ]; then
make all-target-libgcc -j "${JOBS}"
if [ $? -ne 0 ]; then
echo "$configure_project_name: make all-target-libgcc failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
echo "$(date +%s)" > "${build_prefix_project}/${build_target_libgcc_phase_file}"
fi
if [ ! -f "${build_prefix_project}/${install_gcc_phase_file}" ]; then
cd "$build_prefix_project"
make install-strip-gcc
if [ $? -ne 0 ]; then
echo "$configure_project_name: make install-gcc failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
echo "$(date +%s)" > "${build_prefix_project}/${install_gcc_phase_file}"
fi
if [ ! -f "${build_prefix_project}/${install_target_libgcc_phase_file}" ]; then
make install-strip-target-libgcc
if [ $? -ne 0 ]; then
echo "$configure_project_name: make install-target-libgcc failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
fi
if [[ "${is_to_build_install_libc}" == "yes" && "x$is_native_cross" == "xyes" ]]; then
install_libc "${TOOLCHAINS_BUILD_SHARED_STORAGE}" $host_triplet $target_triplet "${build_prefix}/libc" "${build_prefix}/install/libc" "${libc_install_prefix}" "no" "no" "${multilibsettings}" "${is_native_cross}" "yes"
fi
cd "$build_prefix_project"
if [[ "${is_two_phase_build}" == "yes" ]]; then
echo "$(date +%s)" > "${build_prefix_project}/${current_phase_file}"
build_project_gnu_cookie $1 $2 $3 1
return
fi
else
if [[ "x$project_name" == "xgcc" ]]; then
if [[ "x$is_between_build" == "xyes" ]]; then
cd "$build_prefix_project"
if [ ! -f "${build_prefix_project}/${install_gcc_phase_file}" ]; then
cd "$build_prefix_project"
make install-strip-gcc
if [ $? -ne 0 ]; then
echo "$configure_project_name: make install-gcc failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
echo "$(date +%s)" > "${build_prefix_project}/${install_gcc_phase_file}"
fi
if [[ "${is_to_build_install_libc}" == "yes" && "x$is_native_cross" == "xyes" ]]; then
install_libc "${TOOLCHAINS_BUILD_SHARED_STORAGE}" $host_triplet $target_triplet "${build_prefix}/libc" "${build_prefix}/install/libc" "${libc_install_prefix}" "no" "no" "${multilibsettings}" "${is_native_cross}" "yes"
fi
fi
if [ ! -f "${build_prefix_project}/${generate_gcc_limits_phase_file}" ]; then
cat "$TOOLCHAINS_BUILD/gcc/gcc/limitx.h" "$TOOLCHAINS_BUILD/gcc/gcc/glimits.h" "$TOOLCHAINS_BUILD/gcc/gcc/limity.h" > "${build_prefix_project}/gcc/include/limits.h"
echo "$(date +%s)" > "${build_prefix_project}/${generate_gcc_limits_phase_file}"
fi
fi
fi
if [ ! -f "${build_prefix_project}/${build_phase_file}" ]; then
cd "$build_prefix_project"
make -j "${JOBS}"
if [ $? -ne 0 ]; then
echo "$configure_project_name: make failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
echo "$(date +%s)" > "${build_prefix_project}/${build_phase_file}"
fi
if [ ! -f "${build_prefix_project}/${install_phase_file}" ]; then
cd "$build_prefix_project"
make install
if [ $? -ne 0 ]; then
echo "$configure_project_name: make install failed build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
exit 1
fi
cd "$build_prefix_project"
if [[ "x$project_name" == "xbinutils-gdb" ]]; then
STRIP_TRANSFORM_NAME=${host_triplet}-strip make install-strip
else
make install-strip
fi
if [ $? -ne 0 ]; then
echo "$configure_project_name: make install-strip failed {build:$BUILD_TRIPLET, host:$host_triplet, target:$target_triplet}"
fi
echo "$(date +%s)" > "${build_prefix_project}/${install_phase_file}"
fi
if [[ "x${project_name}" == "xgcc" ]]; then
if [[ "x${is_to_build_install_libc}" == "xyes" ]]; then
if [[ "x${is_native_cross}" != "xyes" ]]; then
install_libc "${TOOLCHAINS_BUILD_SHARED_STORAGE}" $host_triplet $target_triplet "${build_prefix}/libc" "${build_prefix}/install/libc" "${libc_install_prefix}" "no" "no" "${multilibsettings}" "${is_native_cross}" "yes"
fi
if [[ "x${is_duplicating_runtime}" == "xyes" ]]; then
duplicating_runtimes "${project_name}" "${build_prefix_project}" "${target_triplet}" "${libc_install_prefix}"
fi
fi
fi
echo "$(date +%s)" > "${build_prefix_project}/${current_phase_file}"
}
packaging_toolchain() {
local host_triplet=$1
local target_triplet=$2
local prefix_parent="${TOOLCHAINSPATH_GNU}/${host_triplet}"
local prefix="${prefix_parent}/${target_triplet}"
local build_prefix="${currentpathnohosttriplet}/${host_triplet}/${target_triplet}"
if [ ! -f "$build_prefix/.packagesuccess" ]; then
rm -f "${prefix}.tar.xz"
cd "$prefix_parent"
XZ_OPT=-e9T0 tar cJf ${target_triplet}.${host_triplet}.tar.xz ${target_triplet}
chmod 755 ${target_triplet}.${host_triplet}.tar.xz
mkdir -p "${build_prefix}"
echo "$(date +%s)" > "$build_prefix/.packagesuccess"
fi
}
build_toolchain() {
build_project_gnu_cookie "binutils-gdb" $1 $2
build_project_gnu_cookie "gcc" $1 $2
packaging_toolchain $1 $2
}
if [[ ${BUILD_GCC_TRIPLET} != ${HOST_GCC_TRIPLET} ]]; then
# canadian
build_toolchain $BUILD_GCC_TRIPLET $HOST_GCC_TRIPLET
if [[ ${BUILD_GCC_TRIPLET} != ${TARGET_GCC_TRIPLET} && ${HOST_GCC_TRIPLET} != ${TARGET_GCC_TRIPLET} ]]; then
# canadian cross (non crossback)
build_toolchain $BUILD_GCC_TRIPLET $TARGET_GCC_TRIPLET
fi
fi
build_toolchain $HOST_GCC_TRIPLET $TARGET_GCC_TRIPLET