148 lines
4.1 KiB
Bash
Executable File
148 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Function to print status messages
|
|
print_status() {
|
|
echo -e "${GREEN}[*] $1${NC}"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[!] $1${NC}"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[!] $1${NC}"
|
|
}
|
|
|
|
# Check if running as root
|
|
if [ "$EUID" -ne 0 ]; then
|
|
print_error "Please run this script as root (use sudo)"
|
|
exit 1
|
|
fi
|
|
|
|
# Detect distribution
|
|
if [ -f /etc/os-release ]; then
|
|
. /etc/os-release
|
|
OS=$NAME
|
|
VER=$VERSION_ID
|
|
else
|
|
print_error "Could not detect distribution"
|
|
exit 1
|
|
fi
|
|
|
|
print_status "Detected OS: $OS $VER"
|
|
|
|
|
|
#----------------------------------------------------------------------------------------------------------
|
|
# INSTALL PREREQUISITE PACKAGES
|
|
#----------------------------------------------------------------------------------------------------------
|
|
|
|
# Define packages based on distribution
|
|
case $OS in
|
|
"Ubuntu"|"Debian GNU/Linux")
|
|
# Common packages for both Ubuntu and Debian
|
|
PACKAGES="cmake make g++ devscripts debhelper build-essential upx musl-tools wget tar ccache ninja-build"
|
|
;;
|
|
*)
|
|
print_error "Unsupported distribution: $OS"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Function to check if a package is installed
|
|
is_package_installed() {
|
|
dpkg -l "$1" 2>/dev/null | grep -q "^ii"
|
|
}
|
|
|
|
# Update package lists
|
|
print_status "Updating package lists..."
|
|
apt-get update
|
|
|
|
# Install missing packages
|
|
print_status "Checking and installing required packages..."
|
|
for pkg in $PACKAGES; do
|
|
if ! is_package_installed "$pkg"; then
|
|
print_status "Installing $pkg..."
|
|
apt-get install -y "$pkg"
|
|
if [ $? -ne 0 ]; then
|
|
print_error "Failed to install $pkg"
|
|
exit 1
|
|
fi
|
|
else
|
|
print_status "$pkg is already installed"
|
|
fi
|
|
done
|
|
|
|
# ----------------------------------------------------------------------------------------------------------
|
|
# MUSL CROSS COMPILERS
|
|
# ----------------------------------------------------------------------------------------------------------
|
|
|
|
# Set install directory
|
|
if [ -n "$SUDO_USER" ] && [ "$SUDO_USER" != "root" ]; then
|
|
USER_HOME=$(eval echo ~$SUDO_USER)
|
|
else
|
|
USER_HOME="$HOME"
|
|
fi
|
|
INSTALL_DIR="$USER_HOME/.musl-cross"
|
|
mkdir -p "$INSTALL_DIR"
|
|
|
|
TMPDIR=$(mktemp -d)
|
|
trap 'rm -rf "$TMPDIR"' EXIT
|
|
|
|
function install_musl_cross() {
|
|
local TOOLCHAIN="$1"
|
|
local MUSL_CC_URL="https://musl.cc"
|
|
if [ ! -d "$INSTALL_DIR/$TOOLCHAIN" ]; then
|
|
echo "Downloading $TOOLCHAIN musl cross toolchain..."
|
|
wget -nc -O "$TMPDIR/$TOOLCHAIN.tgz" $MUSL_CC_URL/$TOOLCHAIN.tgz
|
|
tar -C "$INSTALL_DIR" -xvf "$TMPDIR/$TOOLCHAIN.tgz"
|
|
fi
|
|
}
|
|
|
|
function check_path() {
|
|
if [ -n "$SUDO_USER" ] && [ "$SUDO_USER" != "root" ]; then
|
|
local BASHRC="$USER_HOME/.bashrc"
|
|
local TOOLCHAIN="$1"
|
|
local MUSL_PATH="$INSTALL_DIR/$TOOLCHAIN/bin"
|
|
if ! echo "$PATH" | grep -q "$MUSL_PATH"; then
|
|
echo "Adding $MUSL_PATH to PATH in $BASHRC"
|
|
PATH_LINE="export PATH=\"$MUSL_PATH:\$PATH\""
|
|
if ! grep -Fxq "$PATH_LINE" "$BASHRC"; then
|
|
echo "" >> "$BASHRC"
|
|
echo "# Add musl cross compilers to PATH for dropshell" >> "$BASHRC"
|
|
echo "$PATH_LINE" >> "$BASHRC"
|
|
echo "Added musl cross compilers to $BASHRC"
|
|
echo "You should run 'source ~/.bashrc' to update your PATH"
|
|
else
|
|
echo "You should run 'source ~/.bashrc' to update your PATH"
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
TOOLCHAIN_LIST=(
|
|
"aarch64-linux-musl-cross"
|
|
"x86_64-linux-musl-cross"
|
|
"x86_64-linux-musl-native"
|
|
)
|
|
|
|
for TOOLCHAIN in "${TOOLCHAIN_LIST[@]}"; do
|
|
install_musl_cross "$TOOLCHAIN"
|
|
check_path "$TOOLCHAIN"
|
|
done
|
|
|
|
# Clean up
|
|
rm -rf "$TMPDIR"
|
|
|
|
# ----------------------------------------------------------------------------------------------------------
|
|
# COMPLETE
|
|
# ----------------------------------------------------------------------------------------------------------
|
|
|
|
print_status "All dependencies installed successfully!"
|
|
print_status "You can now run ./build.sh to build the project" |