support pi

This commit is contained in:
Justin Lin
2025-10-09 15:41:47 +11:00
parent c7527c104b
commit e09caec7a8

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Mac Setup Script - Install Git, Node.js, and Python # Cross-Platform Setup Script - Install Git, Node.js, and Python
# This script will install essential development tools on macOS # This script will install essential development tools on macOS and Raspberry Pi (Linux ARM)
set -e # Exit on any error set -e # Exit on any error
@@ -34,30 +34,57 @@ command_exists() {
command -v "$1" >/dev/null 2>&1 command -v "$1" >/dev/null 2>&1
} }
# Function to check if running on macOS # Function to detect operating system
check_macos() { detect_os() {
if [[ "$OSTYPE" != "darwin"* ]]; then if [[ "$OSTYPE" == "darwin"* ]]; then
print_error "This script is designed for macOS only" OS="macos"
print_status "Detected: macOS"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Check if it's Raspberry Pi
if [[ $(uname -m) == "armv"* ]] || [[ $(uname -m) == "aarch64" ]] || grep -q "Raspberry Pi" /proc/cpuinfo 2>/dev/null; then
OS="raspi"
print_status "Detected: Raspberry Pi (Linux ARM)"
else
OS="linux"
print_status "Detected: Linux (x86/x64)"
fi
else
print_error "Unsupported operating system: $OSTYPE"
print_status "This script supports macOS and Raspberry Pi only"
exit 1 exit 1
fi fi
} }
# Function to install Homebrew if not present # Function to update package manager
install_homebrew() { update_packages() {
if command_exists brew; then if [[ "$OS" == "macos" ]]; then
print_success "Homebrew is already installed" if command_exists brew; then
print_status "Updating Homebrew..." print_status "Updating Homebrew..."
brew update brew update
else fi
print_status "Installing Homebrew..." elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" print_status "Updating package lists..."
sudo apt update
# Add Homebrew to PATH for Apple Silicon Macs fi
if [[ $(uname -m) == "arm64" ]]; then }
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)" # Function to install package manager (Homebrew for Mac)
install_package_manager() {
if [[ "$OS" == "macos" ]]; then
if command_exists brew; then
print_success "Homebrew is already installed"
else
print_status "Installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Add Homebrew to PATH for Apple Silicon Macs
if [[ $(uname -m) == "arm64" ]]; then
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
fi
fi fi
fi fi
# For Raspberry Pi, apt is already available
} }
# Function to install Git # Function to install Git
@@ -66,7 +93,11 @@ install_git() {
print_success "Git is already installed: $(git --version)" print_success "Git is already installed: $(git --version)"
else else
print_status "Installing Git..." print_status "Installing Git..."
brew install git if [[ "$OS" == "macos" ]]; then
brew install git
elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
sudo apt install -y git
fi
print_success "Git installed successfully: $(git --version)" print_success "Git installed successfully: $(git --version)"
fi fi
} }
@@ -75,11 +106,16 @@ install_git() {
install_nodejs() { install_nodejs() {
if command_exists node; then if command_exists node; then
print_success "Node.js is already installed: $(node --version)" print_success "Node.js is already installed: $(node --version)"
print_status "Node.js version: $(node --version)"
print_status "npm version: $(npm --version)" print_status "npm version: $(npm --version)"
else else
print_status "Installing Node.js..." print_status "Installing Node.js..."
brew install node if [[ "$OS" == "macos" ]]; then
brew install node
elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
# Install Node.js from NodeSource repository for better ARM support
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
fi
print_success "Node.js installed successfully: $(node --version)" print_success "Node.js installed successfully: $(node --version)"
print_status "npm version: $(npm --version)" print_status "npm version: $(npm --version)"
fi fi
@@ -91,23 +127,48 @@ install_python() {
print_success "Python3 is already installed: $(python3 --version)" print_success "Python3 is already installed: $(python3 --version)"
else else
print_status "Installing Python..." print_status "Installing Python..."
brew install python if [[ "$OS" == "macos" ]]; then
brew install python
elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
sudo apt install -y python3 python3-pip python3-venv
fi
print_success "Python installed successfully: $(python3 --version)" print_success "Python installed successfully: $(python3 --version)"
fi fi
# Check if pip is available # Check if pip is available
if command_exists pip3; then if command_exists pip3; then
print_success "pip3 is available: $(pip3 --version)" print_success "pip3 is available: $(pip3 --version)"
else else
print_warning "pip3 not found, installing..." print_warning "pip3 not found, installing..."
python3 -m ensurepip --upgrade if [[ "$OS" == "macos" ]]; then
python3 -m ensurepip --upgrade
elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
sudo apt install -y python3-pip
fi
fi
}
# Function to install build essentials (mainly for Raspberry Pi)
install_build_tools() {
if [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
print_status "Installing build essentials..."
sudo apt install -y build-essential curl wget
print_success "Build tools installed"
elif [[ "$OS" == "macos" ]]; then
# Xcode command line tools are usually installed with Homebrew
if ! command_exists gcc; then
print_status "Installing Xcode command line tools..."
xcode-select --install
else
print_success "Build tools are available"
fi
fi fi
} }
# Function to install synchan # Function to install synchan
install_synchan() { install_synchan() {
local synchan_dir="$HOME/synchan" local synchan_dir="$HOME/synchan"
if [ -d "$synchan_dir" ]; then if [ -d "$synchan_dir" ]; then
print_warning "Synchan directory already exists at $synchan_dir" print_warning "Synchan directory already exists at $synchan_dir"
read -p "Do you want to remove the existing directory and reinstall? [y/N]: " -n 1 -r read -p "Do you want to remove the existing directory and reinstall? [y/N]: " -n 1 -r
@@ -120,16 +181,16 @@ install_synchan() {
return 0 return 0
fi fi
fi fi
print_status "Installing synchan from https://github.com/lancatlin/synchan..." print_status "Installing synchan from https://github.com/lancatlin/synchan..."
# Check if git is available # Check if git is available
if ! command_exists git; then if ! command_exists git; then
print_error "Git is required to install synchan. Please install Git first." print_error "Git is required to install synchan. Please install Git first."
return 1 return 1
fi fi
# Check if yarn is available # Check if yarn is available, install if not
if ! command_exists yarn; then if ! command_exists yarn; then
print_status "Yarn not found, installing yarn..." print_status "Yarn not found, installing yarn..."
if command_exists npm; then if command_exists npm; then
@@ -139,7 +200,7 @@ install_synchan() {
return 1 return 1
fi fi
fi fi
# Clone the repository # Clone the repository
print_status "Cloning synchan repository..." print_status "Cloning synchan repository..."
if git clone https://github.com/lancatlin/synchan.git "$synchan_dir"; then if git clone https://github.com/lancatlin/synchan.git "$synchan_dir"; then
@@ -148,11 +209,11 @@ install_synchan() {
print_error "Failed to clone synchan repository" print_error "Failed to clone synchan repository"
return 1 return 1
fi fi
# Navigate to the directory and install dependencies # Navigate to the directory and install dependencies
print_status "Installing dependencies with yarn..." print_status "Installing dependencies with yarn..."
cd "$synchan_dir" cd "$synchan_dir"
if yarn install; then if yarn install; then
print_success "Dependencies installed successfully" print_success "Dependencies installed successfully"
print_success "Synchan installed at: $synchan_dir" print_success "Synchan installed at: $synchan_dir"
@@ -161,7 +222,7 @@ install_synchan() {
print_error "Failed to install dependencies with yarn" print_error "Failed to install dependencies with yarn"
return 1 return 1
fi fi
# Return to original directory # Return to original directory
cd - > /dev/null cd - > /dev/null
} }
@@ -169,7 +230,7 @@ install_synchan() {
# Function to install actionwire # Function to install actionwire
install_actionwire() { install_actionwire() {
local actionwire_dir="$HOME/actionwire" local actionwire_dir="$HOME/actionwire"
if [ -d "$actionwire_dir" ]; then if [ -d "$actionwire_dir" ]; then
print_warning "Actionwire directory already exists at $actionwire_dir" print_warning "Actionwire directory already exists at $actionwire_dir"
read -p "Do you want to remove the existing directory and reinstall? [y/N]: " -n 1 -r read -p "Do you want to remove the existing directory and reinstall? [y/N]: " -n 1 -r
@@ -182,22 +243,32 @@ install_actionwire() {
return 0 return 0
fi fi
fi fi
print_status "Installing actionwire from https://github.com/lancatlin/actionwire..." print_status "Installing actionwire from https://github.com/lancatlin/actionwire..."
# Check if git is available # Check if git is available
if ! command_exists git; then if ! command_exists git; then
print_error "Git is required to install actionwire. Please install Git first." print_error "Git is required to install actionwire. Please install Git first."
return 1 return 1
fi fi
# Check if poetry is available # Check if poetry is available
if ! command_exists poetry; then if ! command_exists poetry; then
print_status "Poetry not found, installing poetry..." print_status "Poetry not found, installing poetry..."
brew install poetry if [[ "$OS" == "macos" ]]; then
print_status "Poetry installed" brew install poetry
elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
# Install poetry via pip
python3 -m pip install --user poetry
# Add poetry to PATH if not already there
if ! command_exists poetry; then
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
export PATH="$HOME/.local/bin:$PATH"
fi
fi
print_success "Poetry installed"
fi fi
# Clone the repository # Clone the repository
print_status "Cloning actionwire repository..." print_status "Cloning actionwire repository..."
if git clone https://github.com/lancatlin/actionwire.git "$actionwire_dir"; then if git clone https://github.com/lancatlin/actionwire.git "$actionwire_dir"; then
@@ -206,11 +277,11 @@ install_actionwire() {
print_error "Failed to clone actionwire repository" print_error "Failed to clone actionwire repository"
return 1 return 1
fi fi
# Navigate to the directory and install dependencies # Navigate to the directory and install dependencies
print_status "Installing dependencies with poetry..." print_status "Installing dependencies with poetry..."
cd "$actionwire_dir" cd "$actionwire_dir"
if poetry install; then if poetry install; then
print_success "Dependencies installed successfully" print_success "Dependencies installed successfully"
print_success "Actionwire installed at: $actionwire_dir" print_success "Actionwire installed at: $actionwire_dir"
@@ -235,7 +306,7 @@ install_actionwire() {
return 1 return 1
fi fi
fi fi
# Return to original directory # Return to original directory
cd - > /dev/null cd - > /dev/null
} }
@@ -243,37 +314,56 @@ install_actionwire() {
# Function to install additional useful tools # Function to install additional useful tools
install_additional_tools() { install_additional_tools() {
print_status "Installing additional useful development tools..." print_status "Installing additional useful development tools..."
# Install common tools if [[ "$OS" == "macos" ]]; then
brew install curl wget jq tree # Install common tools
brew install curl wget jq tree
# Install development tools
brew install --cask visual-studio-code # Install development tools
brew install --cask iterm2 brew install --cask visual-studio-code
brew install --cask iterm2
print_success "Additional tools installed"
print_success "Additional tools installed"
elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
# Install common tools
sudo apt install -y curl wget jq tree vim nano htop
# Install VS Code for ARM if available
if [[ $(uname -m) == "aarch64" ]]; then
print_status "Installing VS Code for ARM64..."
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=arm64,armhf,amd64 signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update
sudo apt install -y code
else
print_warning "VS Code may not be available for this ARM architecture"
fi
print_success "Additional tools installed"
fi
} }
# Function to verify installations # Function to verify installations
verify_installations() { verify_installations() {
print_status "Verifying installations..." print_status "Verifying installations..."
echo "" echo ""
print_status "=== Installation Summary ===" print_status "=== Installation Summary ==="
if command_exists git; then if command_exists git; then
print_success "✓ Git: $(git --version)" print_success "✓ Git: $(git --version)"
else else
print_error "✗ Git installation failed" print_error "✗ Git installation failed"
fi fi
if command_exists node; then if command_exists node; then
print_success "✓ Node.js: $(node --version)" print_success "✓ Node.js: $(node --version)"
print_success "✓ npm: $(npm --version)" print_success "✓ npm: $(npm --version)"
else else
print_error "✗ Node.js installation failed" print_error "✗ Node.js installation failed"
fi fi
if command_exists python3; then if command_exists python3; then
print_success "✓ Python3: $(python3 --version)" print_success "✓ Python3: $(python3 --version)"
if command_exists pip3; then if command_exists pip3; then
@@ -282,20 +372,22 @@ verify_installations() {
else else
print_error "✗ Python3 installation failed" print_error "✗ Python3 installation failed"
fi fi
if command_exists brew; then if [[ "$OS" == "macos" ]]; then
print_success "✓ Homebrew: $(brew --version | head -n1)" if command_exists brew; then
else print_success "✓ Homebrew: $(brew --version | head -n1)"
print_error "✗ Homebrew installation failed" else
print_error "✗ Homebrew installation failed"
fi
fi fi
# Check synchan installation # Check synchan installation
if [ -d "$HOME/synchan" ]; then if [ -d "$HOME/synchan" ]; then
print_success "✓ Synchan: Installed at $HOME/synchan" print_success "✓ Synchan: Installed at $HOME/synchan"
else else
print_warning "⚠ Synchan: Not installed" print_warning "⚠ Synchan: Not installed"
fi fi
# Check actionwire installation # Check actionwire installation
if [ -d "$HOME/actionwire" ]; then if [ -d "$HOME/actionwire" ]; then
print_success "✓ Actionwire: Installed at $HOME/actionwire" print_success "✓ Actionwire: Installed at $HOME/actionwire"
@@ -306,21 +398,27 @@ verify_installations() {
# Main execution # Main execution
main() { main() {
print_status "Starting Mac development environment setup..." print_status "Starting cross-platform development environment setup..."
print_status "This script will install: Git, Node.js, Python, Homebrew, and optionally synchan and actionwire" print_status "This script will install: Git, Node.js, Python, and optionally synchan and actionwire"
echo "" echo ""
# Check if running on macOS # Detect operating system
check_macos detect_os
# Install Homebrew first (required for other packages) # Update package manager
install_homebrew update_packages
# Install package manager if needed (Homebrew for Mac)
install_package_manager
# Install build tools
install_build_tools
# Install core development tools # Install core development tools
install_git install_git
install_nodejs install_nodejs
install_python install_python
# Ask if user wants to install synchan # Ask if user wants to install synchan
echo "" echo ""
read -p "Do you want to install synchan from GitHub? [y/N]: " -n 1 -r read -p "Do you want to install synchan from GitHub? [y/N]: " -n 1 -r
@@ -328,7 +426,7 @@ main() {
if [[ $REPLY =~ ^[Yy]$ ]]; then if [[ $REPLY =~ ^[Yy]$ ]]; then
install_synchan install_synchan
fi fi
# Ask if user wants to install actionwire # Ask if user wants to install actionwire
echo "" echo ""
read -p "Do you want to install actionwire from GitHub? [y/N]: " -n 1 -r read -p "Do you want to install actionwire from GitHub? [y/N]: " -n 1 -r
@@ -336,22 +434,28 @@ main() {
if [[ $REPLY =~ ^[Yy]$ ]]; then if [[ $REPLY =~ ^[Yy]$ ]]; then
install_actionwire install_actionwire
fi fi
# Ask if user wants additional tools # Ask if user wants additional tools
echo "" echo ""
read -p "Do you want to install additional development tools (VS Code, iTerm2, etc.)? [y/N]: " -n 1 -r read -p "Do you want to install additional development tools? [y/N]: " -n 1 -r
echo "" echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then if [[ $REPLY =~ ^[Yy]$ ]]; then
install_additional_tools install_additional_tools
fi fi
# Verify all installations # Verify all installations
verify_installations verify_installations
echo "" echo ""
print_success "Setup complete! Your Mac development environment is ready." print_success "Setup complete! Your development environment is ready."
print_status "You may need to restart your terminal or run 'source ~/.zprofile' to use the new tools."
if [[ "$OS" == "macos" ]]; then
print_status "You may need to restart your terminal or run 'source ~/.zprofile' to use the new tools."
elif [[ "$OS" == "raspi" ]] || [[ "$OS" == "linux" ]]; then
print_status "You may need to restart your terminal or run 'source ~/.bashrc' to use the new tools."
print_status "If poetry was installed, you may need to restart your terminal for PATH changes to take effect."
fi
} }
# Run main function # Run main function
main "$@" main "$@"