#!/bin/bash
# -*- coding: utf-8 -*-
# Timestamp: "2025-11-11 23:10:00 (ywatanabe)"
# File: ./scripts/shell/modules/select_compilation_engine.sh
# Select and verify compilation engine
THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Source command switching module for engine detection
source "${THIS_DIR}/command_switching.src"
# Auto-detect best available engine
auto_detect_engine() {
# Default priority: latexmk (fastest for development) → tectonic (fallback) → 3pass (guaranteed)
local auto_order="${SCITEX_WRITER_AUTO_ORDER:-latexmk tectonic 3pass}"
for engine in $auto_order; do
if verify_engine "$engine" >/dev/null 2>&1; then
echo "$engine"
return 0
fi
done
# Fallback to 3pass (always works if pdflatex exists)
echo "3pass"
}
# Verify engine is available
verify_engine() {
local engine="$1"
case "$engine" in
tectonic)
get_cmd_tectonic >/dev/null 2>&1
return $?
;;
latexmk)
# Need both latexmk and pdflatex
get_cmd_latexmk >/dev/null 2>&1 && \
get_cmd_pdflatex >/dev/null 2>&1
return $?
;;
3pass)
# Need pdflatex and bibtex
get_cmd_pdflatex >/dev/null 2>&1 && \
get_cmd_bibtex >/dev/null 2>&1
return $?
;;
*)
echo_error "Unknown engine: $engine"
return 1
;;
esac
}
# Get human-readable engine info
get_engine_info() {
local engine="$1"
case "$engine" in
tectonic)
echo "🔄 Tectonic (Reproducible, 4-5s per compile)"
;;
latexmk)
echo "⚡ latexmk (Smart incremental, 3s)"
;;
3pass)
echo "🔒 3-pass (Guaranteed correctness, 6-7s)"
;;
esac
}
# Get engine version
get_engine_version() {
local engine="$1"
case "$engine" in
tectonic)
local cmd=$(get_cmd_tectonic)
if [ -n "$cmd" ]; then
$cmd --version 2>&1 | head -1 | grep -oP '\d+\.\d+\.\d+'
fi
;;
latexmk)
local cmd=$(get_cmd_latexmk)
if [ -n "$cmd" ]; then
$cmd -version 2>&1 | head -1 | grep -oP '\d+\.\d+'
fi
;;
3pass)
echo "native"
;;
esac
}
# List all available engines
list_available_engines() {
echo "Available compilation engines:"
echo ""
for engine in tectonic latexmk 3pass; do
if verify_engine "$engine" >/dev/null 2>&1; then
local version=$(get_engine_version "$engine")
local info=$(get_engine_info "$engine")
printf " ✓ %-10s (%-10s) %s\n" "$engine" "$version" "$info"
else
printf " ✗ %-10s (not available)\n" "$engine"
fi
done
}
# Export functions
export -f auto_detect_engine
export -f verify_engine
export -f get_engine_info
export -f get_engine_version
export -f list_available_engines
# EOF