#!/bin/bash
# Universal dependency installer for scitex-writer
# Handles system and Python dependencies across platforms
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
install_yq() {
log_info "Checking yq installation..."
# Check if Go-based yq is already installed
if command -v yq &> /dev/null && yq --version 2>&1 | grep -q "mikefarah"; then
log_info "yq (Go version) already installed: $(yq --version)"
return 0
fi
log_info "Installing yq (Go version)..."
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
sudo wget -qO /usr/local/bin/yq \
https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
elif [[ "$OSTYPE" == "darwin"* ]]; then
sudo wget -qO /usr/local/bin/yq \
https://github.com/mikefarah/yq/releases/latest/download/yq_darwin_amd64
sudo chmod +x /usr/local/bin/yq
else
log_warn "Unsupported OS for automatic yq installation. Please install manually."
return 1
fi
log_info "yq installed: $(yq --version)"
}
install_debian_deps() {
log_info "Installing Debian/Ubuntu system dependencies..."
sudo apt-get update
# Install from file
if [ -f "$SCRIPT_DIR/system-debian.txt" ]; then
log_info "Installing packages from system-debian.txt..."
xargs sudo apt-get install -y < "$SCRIPT_DIR/system-debian.txt"
else
log_error "system-debian.txt not found!"
return 1
fi
log_info "Debian/Ubuntu dependencies installed successfully!"
}
install_macos_deps() {
log_info "Installing macOS system dependencies..."
# Check if Homebrew is installed
if ! command -v brew &> /dev/null; then
log_error "Homebrew not found. Please install from https://brew.sh"
return 1
fi
# Install from file
if [ -f "$SCRIPT_DIR/system-macos.txt" ]; then
log_info "Installing packages from system-macos.txt..."
while IFS= read -r package || [ -n "$package" ]; do
# Skip comments and empty lines
[[ "$package" =~ ^#.*$ ]] && continue
[[ -z "$package" ]] && continue
brew install "$package" || log_warn "Failed to install $package"
done < "$SCRIPT_DIR/system-macos.txt"
else
log_error "system-macos.txt not found!"
return 1
fi
log_info "macOS dependencies installed successfully!"
log_warn "Remember to update TeX Live Manager:"
log_warn " sudo tlmgr update --self"
log_warn " sudo tlmgr install collection-latexextra collection-fontsrecommended"
}
install_python_deps() {
log_info "Installing Python dependencies..."
# Check if pip is available
if ! command -v pip &> /dev/null && ! command -v pip3 &> /dev/null; then
log_error "pip not found. Please install Python and pip first."
return 1
fi
local PIP_CMD="pip"
command -v pip3 &> /dev/null && PIP_CMD="pip3"
if [ -f "$SCRIPT_DIR/python.txt" ]; then
log_info "Installing packages from python.txt..."
$PIP_CMD install -r "$SCRIPT_DIR/python.txt"
else
log_error "python.txt not found!"
return 1
fi
log_info "Python dependencies installed successfully!"
}
detect_and_install() {
log_info "Detecting system and installing dependencies..."
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
if command -v apt-get &> /dev/null; then
log_info "Detected: Debian/Ubuntu"
install_debian_deps
elif command -v yum &> /dev/null; then
log_error "Red Hat/CentOS not yet supported. Please install dependencies manually."
log_error "Or use the container: ./compile.sh manuscript"
return 1
else
log_error "Unsupported Linux distribution"
return 1
fi
elif [[ "$OSTYPE" == "darwin"* ]]; then
log_info "Detected: macOS"
install_macos_deps
else
log_error "Unsupported operating system: $OSTYPE"
log_error "Please use the container: ./compile.sh manuscript"
return 1
fi
# Install yq (works on both Linux and macOS)
install_yq
# Install Python dependencies (cross-platform)
install_python_deps
}
show_usage() {
cat << EOF
Usage: $0 [OPTIONS]
Install all dependencies for scitex-writer project.
OPTIONS:
--system-only Install only system dependencies
--python-only Install only Python dependencies
--yq-only Install only yq
-h, --help Show this help message
EXAMPLES:
$0 # Install all dependencies
$0 --system-only # Install only system packages
$0 --python-only # Install only Python packages
EOF
}
main() {
case "${1:-}" in
--system-only)
log_info "Installing system dependencies only..."
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
install_debian_deps
elif [[ "$OSTYPE" == "darwin"* ]]; then
install_macos_deps
fi
install_yq
;;
--python-only)
log_info "Installing Python dependencies only..."
install_python_deps
;;
--yq-only)
install_yq
;;
-h|--help)
show_usage
exit 0
;;
"")
detect_and_install
;;
*)
log_error "Unknown option: $1"
show_usage
exit 1
;;
esac
echo ""
log_info "✅ All dependencies installed successfully!"
log_info "You can now run: ./compile.sh manuscript"
}
main "$@"