e_info() { printf "\e[32m* %s\e[0m\n" "$@" } e_warn() { printf "\e[33m* %s\e[0m\n" "$@" } exit_err() { printf "\e[31m* Error: %s\e[0m\n" "$@" exit 1; } unlink_expected() { local file="$1" shift local expected="$1" shift local actual if [[ -h "${file}" ]]; then actual="$(readlink "${file}")" if [[ "${expected}" == "${actual}" ]]; then e_warn "Unlinking ${file}" unlink "${file}" || exit_err "Can't unlink ${file}" else exit_err "${file} has unexpected content: ${actual} ( expected: ${expected} )" fi elif [[ -e "${file}" ]]; then exit_err "${file} is not a symlink" else e_info "${file} already removed" fi } relink_expected() { local file="$1" shift local expected="$1" shift local actual if [[ ! -e "${file}" ]]; then e_warn "Linking ${file} to ${expected}" ln -s "${expected}" "${file}" elif [[ ! -h "${file}" ]]; then exit_err "${file} exists and is not a symlink" else actual="$(readlink "${file}")" if [[ "${expected}" != "${actual}" ]]; then exit_err "${file} exists and doesn't link to ${expected} (got: ${actual})" else e_info "${file} already linked" fi fi } arch_prefix="x86_64-pc-linux-gnu" BINUTILS_TARGETS=( addr2line ar as c++filt coffdump dlltool dllwrap dwp elfedit gprof ld ld.bfd ld.gold nm objcopy objdump ranlib readelf size srcconv strings strip sysdump windmc windres ) GCC_TARGETS=( c++ cpp g++ gcc gccgo gcov gfortran ) if [[ "${RELINK:-0}" == "0" ]]; then fixlink() { unlink_expected "$@" } else fixlink() { relink_expected "$@" } fi for target in "${BINUTILS_TARGETS[@]}"; do fixlink "/usr/bin/${target}" "${arch_prefix}-${target}" done gcc_root="$(gcc-config -B)" fixlink "/usr/bin/cc" "${gcc_root}/gcc" for target in "${GCC_TARGETS[@]}"; do fixlink "/usr/bin/${target}" "${gcc_root}/${target}" done