toolchains/toolchains.sh
2023-11-11 23:26:23 -06:00

294 lines
7.6 KiB
Bash
Executable file

#!/bin/bash -e
#
# Kangaroo Punch Toolchains
# Copyright 2023-2024 Scott Duensing <scott@kangaroopunch.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the “Software”), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
#
PIURL=https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-
function buildMacOSXToolchain() {
local SDK=$1
local XCODE=$2
local PLATFORM=$3
local BASE=$(pwd)
local CLANG=
local RTPATH=
local CROSSTOOLS="${BASE}/x-tools/${PLATFORM}"
mkdir -p work
if [[ ! -d work/osxcross ]]; then
git clone https://github.com/tpoechtrager/osxcross.git work/osxcross
sudo work/osxcross/tools/get_dependencies.sh
fi
if [[ ! -f x-tools/${PLATFORM}/toolchain.cmake ]]; then
pushd work/osxcross
# Have we built Apple's clang?
if [[ ! -d "${BASE}/clang" ]]; then
UNATTENDED=1 INSTALLPREFIX=${BASE}/clang ./build_apple_clang.sh
pushd build/clang*/build_stage2
make install
popd
fi
# Use our fresh new clang.
source <("${CROSSTOOLS}/bin/osxcross-conf" 2>/dev/null)
export PATH="${BASE}/clang/bin:${CROSSTOOLS}/bin:${PATH}"
export CC="${BASE}/clang/bin/clang"
export CXX="${BASE}/clang/bin/clang++"
# Do we have an existing SDK tarball?
if [[ ! -f "${BASE}/${SDK}" ]]; then
# Nope. Build tarball and keep for later.
./tools/gen_sdk_package_pbzx.sh "${BASE}/${XCODE}"
mv -f MacOSX* "${BASE}/."
fi
# Put tarball in place.
cp -f "${BASE}/${SDK}" tarballs/.
# Build SDK.
UNATTENDED=1 TARGET_DIR="${CROSSTOOLS}" ./build.sh
# Fix fubar in osxcross.
[[ -d target ]] && rm -rf target
ln -sf "${CROSSTOOLS}" target
:<<NO_GCC
# Build GCC
# Fix another fubar in osxcross.
if [[ ! -f build_gcc-fixed.sh ]]; then
sed '/^pushd gcc.*/a \.\/contrib\/download_prerequisites' build_gcc.sh > build_gcc-fixed.sh
chmod +x build_gcc-fixed.sh
fi
TARGET_DIR="${CROSSTOOLS}" ./build_gcc-fixed.sh
NO_GCC
# Build compiler runtime.
#***TODO*** This fails to find <optional> for x86.
RTPATH="${BASE}/clang/lib/clang"
CLANG=$(ls -1 "${RTPATH}" | grep -F . | sort | tail -n1)
if [[ "${CLANG}" == "" ]]; then
CLANG=$(ls -1 "${RTPATH}" | sort | tail -n1)
fi
RTPATH="${RTPATH}/${CLANG}/lib/darwin"
if [[ -d "${RTPATH}" ]]; then
rm -rf "${RTPATH}"
fi
CXX_FLAGS="-std=c++17" ENABLE_COMPILER_RT_INSTALL=1 ./build_compiler_rt.sh
if [[ -d "${RTPATH}" ]]; then
mv -f "${RTPATH}" "${CROSSTOOLS}/."
echo "RTPATH=\"${RTPATH}\"" > ${CROSSTOOLS}/rtpath.inc
fi
# Tidy up for next build.
./cleanup.sh
popd
fi
}
function install_x86_64_linux() {
# Required tools for Linux x86_64. These should always be installed.
sudo apt-get install -y \
autoconf \
binutils \
bison \
build-essential \
clang \
cmake \
cmake-curses-gui \
curl \
flex \
git \
git-lfs \
liblzma-dev \
libtool \
nasm \
texinfo \
unzip \
zlib1g-dev
}
function install_x86_linux() {
# x86 Linux support.
sudo dpkg --add-architecture i386
sudo apt-get install -y \
gcc-i686-linux-gnu \
g++-i686-linux-gnu
}
function install_x86_64_windows() {
# x86 and x86_64 Windows.
sudo apt-get install -y mingw-w64
}
function install_aarch64_pi() {
# Raspberry Pi, aarch64.
wget -O- ${PIURL}aarch64-rpi3-linux-gnu.tar.xz | tar xJ
#***TODO*** sysroot
}
function install_armv6_pi() {
# Raspberry Pi, armv6.
wget -O- ${PIURL}armv6-rpi-linux-gnueabihf.tar.xz | tar xJ
#***TODO*** sysroot
}
function install_armv8_pi() {
# Raspberry Pi, armv8.
wget -O- ${PIURL}armv8-rpi3-linux-gnueabihf.tar.xz | tar xJ
#***TODO*** sysroot
}
function install_x86_64_macos() {
# MacOS x86, x86_64.
#***TODO*** https://stackoverflow.com/questions/67712376/after-updating-gcc-clang-cant-find-libstdc-anymore
buildMacOSXToolchain MacOSX10.13.sdk.tar.xz Xcode_9.4.1.xip x86_64-macos-apple
}
function install_aarch64_macos() {
# MacOS aarch64.
#***TODO*** https://stackoverflow.com/questions/67712376/after-updating-gcc-clang-cant-find-libstdc-anymore
buildMacOSXToolchain MacOSX13.3.sdk.tar.xz Xcode_14.3.1.xip aarch64-macos-apple
}
function install_x86_dos() {
# DJGPP for DOS.
export DJGPP_PREFIX=$(pwd)/x-tools/djgpp
mkdir -p work
if [[ ! -d work/build-djgpp ]]; then
git clone https://github.com/andrewwutw/build-djgpp.git work/build-djgpp
fi
if [[ ! -f x-tools/djgpp/setenv ]]; then
pushd work/build-djgpp
./build-djgpp.sh 12.2.0
popd
fi
}
MODE=$1
ARCH=$2
PLAT=$3
HELP=1
COLS=2
ROWS=9
row=0
declare -A PLATFORMS=()
PLATFORMS[0]="x86_64"; PLATFORMS[1]="linux"
PLATFORMS[2]="x86"; PLATFORMS[3]="linux"
PLATFORMS[4]="x86_64"; PLATFORMS[5]="windows"
PLATFORMS[6]="aarch64"; PLATFORMS[7]="pi"
PLATFORMS[8]="armv6"; PLATFORMS[9]="pi"
PLATFORMS[10]="armv8"; PLATFORMS[11]="pi"
PLATFORMS[12]="x86_64"; PLATFORMS[13]="macos"
PLATFORMS[14]="aarch64"; PLATFORMS[15]="macos"
PLATFORMS[16]="x86"; PLATFORMS[17]="dos"
if [[ "${MODE}" == "install" ]]; then
# Install all toolchains.
if [[ "${ARCH}" == "all" && "${PLAT}" == "all" ]]; then
HELP=0
for (( row=0; row<ROWS; row++ )); do
set -x
install_${PLATFORMS[$((${COLS}*${row}))]}_${PLATFORMS[$((${COLS}*${row}+1))]}
set +x
done
fi
# Install all toolchains for a specific platform.
if [[ "${ARCH}" == "all" && "${PLAT}" != "all" ]]; then
HELP=0
for (( row=0; row<ROWS; row++ )); do
if [[ "${PLAT}" == "${PLATFORMS[$((${COLS}*${row}+1))]}" ]]; then
set -x
install_${PLATFORMS[$((${COLS}*${row}))]}_${PLAT}
set +x
fi
done
fi
# Install a single toolchain.
if [[ "${ARCH}" != "all" && "${PLAT}" != "all" ]]; then
for (( row=0; row<ROWS; row++ )); do
if [[ "${ARCH}" == "${PLATFORMS[$((${COLS}*${row}))]}" && "${PLAT}" == "${PLATFORMS[$((${COLS}*${row}+1))]}" ]]; then
HELP=0
set -x
install_${ARCH}_${PLAT}
set +x
fi
done
fi
fi
if [[ "${MODE}" == "use" ]]; then
for (( row=0; row<ROWS; row++ )); do
if [[ "${ARCH}" == "${PLATFORMS[$((${COLS}*${row}))]}" && "${PLAT}" == "${PLATFORMS[$((${COLS}*${row}+1))]}" ]]; then
HELP=0
set -x
#use_${ARCH}_${PLAT}
set +x
fi
done
fi
# Do they need help?
if [[ ${HELP} -eq 1 ]]; then
cat <<-HELP
Kangaroo Punch Toolchain Installer
http://skunkworks.kangaroopunch.com
Usage: $0 install [architecture] [platform]
Where [architecture] and [platform] are one of:
HELP
for (( row=0; row<ROWS; row++ )); do
printf ' %-10s %s\n' "${PLATFORMS[$((${COLS}*${row}))]}" "${PLATFORMS[$((${COLS}*${row}+1))]}"
done
cat <<-HELP
If [architecture] and [platform] are both "all",
everything will be installed.
if [architecture] is "all", then all available
architectures for the specified [platform] will
be installed.
NOTE: You should always install x86_64 linux
before attempting to install other
toolchains.
HELP
fi