170 lines
4.3 KiB
Bash
Executable File
170 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Smart dependency installer for Turmli Bar Calendar
|
||
# Automatically handles compilation failures and falls back to compatible versions
|
||
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Print functions
|
||
print_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
}
|
||
|
||
# Detect system architecture
|
||
ARCH=$(uname -m)
|
||
OS=$(uname -s)
|
||
|
||
print_info "System detected: ${OS} ${ARCH}"
|
||
|
||
# Check if we have compilation tools
|
||
check_compiler() {
|
||
if command -v gcc &> /dev/null; then
|
||
return 0
|
||
else
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Create requirements file based on capabilities
|
||
create_requirements() {
|
||
local req_file=$1
|
||
local use_minimal=$2
|
||
|
||
if [ "$use_minimal" = "true" ]; then
|
||
print_info "Creating minimal requirements (no compilation needed)..."
|
||
cat > "$req_file" << 'EOF'
|
||
# Minimal requirements - no compilation needed
|
||
# Uses older but stable versions with pre-built wheels
|
||
fastapi==0.95.2
|
||
uvicorn==0.22.0
|
||
httpx==0.24.1
|
||
icalendar==5.0.7
|
||
jinja2==3.1.2
|
||
apscheduler==3.10.1
|
||
pytz==2023.3
|
||
python-multipart==0.0.6
|
||
pydantic==1.10.9
|
||
EOF
|
||
else
|
||
print_info "Creating standard requirements..."
|
||
cat > "$req_file" << 'EOF'
|
||
# Standard requirements
|
||
fastapi>=0.104.0
|
||
uvicorn[standard]>=0.24.0
|
||
httpx>=0.25.0
|
||
icalendar>=5.0.0
|
||
jinja2>=3.1.0
|
||
python-multipart>=0.0.6
|
||
apscheduler>=3.10.0
|
||
pytz>=2023.3
|
||
EOF
|
||
fi
|
||
}
|
||
|
||
# Try to install with pre-built wheels only
|
||
try_wheels_only() {
|
||
print_info "Attempting to install from pre-built wheels only..."
|
||
pip install --no-cache-dir --only-binary :all: -r requirements.txt 2>/dev/null
|
||
return $?
|
||
}
|
||
|
||
# Try standard installation
|
||
try_standard_install() {
|
||
print_info "Attempting standard installation..."
|
||
pip install --no-cache-dir -r requirements.txt
|
||
return $?
|
||
}
|
||
|
||
# Main installation logic
|
||
main() {
|
||
# Check Python version
|
||
PYTHON_VERSION=$(python3 --version 2>&1 | grep -Po '(?<=Python )\d+\.\d+')
|
||
print_info "Python version: ${PYTHON_VERSION}"
|
||
|
||
# Upgrade pip first
|
||
print_info "Upgrading pip..."
|
||
pip install --upgrade pip
|
||
|
||
# Check if we're on ARM without build tools
|
||
if [[ "$ARCH" == "arm"* ]] || [[ "$ARCH" == "aarch64" ]]; then
|
||
print_warning "ARM architecture detected"
|
||
|
||
if ! check_compiler; then
|
||
print_warning "No compiler found, using minimal dependencies"
|
||
create_requirements "requirements.txt" "true"
|
||
|
||
if try_standard_install; then
|
||
print_success "Successfully installed minimal dependencies!"
|
||
exit 0
|
||
else
|
||
print_error "Installation failed even with minimal dependencies"
|
||
exit 1
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# Try wheels-only first (fastest, no compilation)
|
||
print_info "Trying to install from pre-built wheels..."
|
||
if pip install --no-cache-dir --only-binary :all: \
|
||
fastapi==0.95.2 \
|
||
uvicorn==0.22.0 \
|
||
httpx==0.24.1 \
|
||
icalendar==5.0.7 \
|
||
jinja2==3.1.2 \
|
||
apscheduler==3.10.1 \
|
||
pytz==2023.3 \
|
||
python-multipart==0.0.6 \
|
||
pydantic==1.10.9 2>/dev/null; then
|
||
print_success "Successfully installed from pre-built wheels!"
|
||
exit 0
|
||
fi
|
||
|
||
print_warning "Wheels-only installation failed, trying with compilation..."
|
||
|
||
# Create standard requirements
|
||
create_requirements "requirements.txt" "false"
|
||
|
||
# Try standard installation
|
||
if try_standard_install; then
|
||
print_success "Successfully installed standard dependencies!"
|
||
exit 0
|
||
fi
|
||
|
||
print_warning "Standard installation failed, falling back to minimal..."
|
||
|
||
# Fall back to minimal requirements
|
||
create_requirements "requirements.txt" "true"
|
||
|
||
if try_standard_install; then
|
||
print_success "Successfully installed minimal dependencies!"
|
||
exit 0
|
||
fi
|
||
|
||
print_error "All installation attempts failed!"
|
||
print_info "Manual intervention required. Try:"
|
||
echo " 1. Install build tools: apt-get install gcc python3-dev"
|
||
echo " 2. Or use Docker/Podman with pre-built image"
|
||
exit 1
|
||
}
|
||
|
||
# Run main function
|
||
main |