Files
mp-units/.devcontainer/api_reference.sh
2025-08-26 22:30:01 +02:00

166 lines
5.3 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
# Script to build API reference documentation
# Usage: ./api_reference.sh [-s] [-d DIR] [-h]
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
DEFAULT_DEPS_DIR="$(dirname "$PROJECT_ROOT")/api_reference_deps"
# Default values
BUILD_DOCS=true
DEPS_DIR="$DEFAULT_DEPS_DIR"
show_usage() {
echo "Usage: $0 [-s] [-d DIR] [-h]"
echo ""
echo "Generate API reference documentation from C++ source code."
echo "By default, the script performs both setup (CMake configuration) and build."
echo ""
echo "Options:"
echo " -s Setup only (skip building the documentation)"
echo " -d DIR Directory for dependencies (default: $DEFAULT_DEPS_DIR)"
echo " This directory will contain cloned repositories:"
echo " - jegp.cmake_modules: CMake modules for documentation"
echo " - draft: C++ standard draft sources"
echo " - cxxdraft-htmlgen: HTML generation tools"
echo " -h Show this help message"
echo ""
echo "Examples:"
echo " $0 # Setup and build documentation (default)"
echo " $0 -s # Setup only, skip build"
echo " $0 -d /tmp/api_deps # Use custom dependency directory"
echo " $0 -s -d ./deps # Setup only with custom directory"
}
# Parse command line arguments using getopts
while getopts :hsd: opt; do
case $opt in
h)
show_usage
exit 0
;;
s)
BUILD_DOCS=false
;;
d)
DEPS_DIR="$OPTARG"
;;
\?)
echo "Error: Invalid option -$OPTARG" >&2
show_usage
exit 1
;;
:)
echo "Error: Option -$OPTARG requires an argument" >&2
show_usage
exit 1
;;
esac
done
shift $((OPTIND - 1))
echo "Setting up API reference documentation..."
echo "Dependencies directory: $DEPS_DIR"
echo "Project root: $PROJECT_ROOT"
# Create dependencies directory if it doesn't exist
if [[ ! -d "$DEPS_DIR" ]]; then
echo "Creating dependencies directory: $DEPS_DIR"
mkdir -p "$DEPS_DIR"
else
echo "Dependencies directory already exists: $DEPS_DIR"
fi
# Clone repositories if they don't already exist
clone_if_missing() {
local repo_url="$1"
local branch="$2"
local target_dir="$3"
local repo_name=$(basename "$repo_url" .git)
local full_path="$target_dir/$repo_name"
if [[ ! -d "$full_path" ]]; then
echo "Cloning $repo_name..."
if [[ "$branch" == "default" ]]; then
git clone "$repo_url" --depth=1 "$full_path"
else
git clone "$repo_url" --branch "$branch" --depth=1 "$full_path"
fi
else
echo "Repository $repo_name already exists at $full_path"
fi
}
# Clone required repositories
clone_if_missing "https://github.com/JohelEGP/jegp.cmake_modules.git" "default" "$DEPS_DIR"
clone_if_missing "https://github.com/JohelEGP/draft.git" "standardese_sources_base" "$DEPS_DIR"
clone_if_missing "https://github.com/JohelEGP/cxxdraft-htmlgen.git" "standardese_sources_base" "$DEPS_DIR"
# Configure CMake
echo "Configuring CMake for API reference documentation..."
BUILD_DIR="$PROJECT_ROOT/build/docs/api_reference"
SOURCE_DIR="$PROJECT_ROOT/docs/api_reference/src"
if [[ ! -d "$SOURCE_DIR" ]]; then
echo "Error: Source directory not found: $SOURCE_DIR" >&2
exit 1
fi
cmake -S "$SOURCE_DIR" \
-B "$BUILD_DIR" \
-DCMAKE_MODULE_PATH="$DEPS_DIR/jegp.cmake_modules/modules" \
-DJEGP_STANDARDESE_SOURCES_GIT_REPOSITORY="$DEPS_DIR/draft" \
-DJEGP_CXXDRAFT_HTMLGEN_GIT_REPOSITORY="$DEPS_DIR/cxxdraft-htmlgen"
echo "CMake configuration completed successfully."
# Create symlink for generated HTML documentation
# This allows accessing the generated docs via docs/api_reference/gen
echo "Creating symlink for generated documentation..."
SYMLINK_TARGET="$PROJECT_ROOT/docs/api_reference/gen"
SYMLINK_SOURCE="${BUILD_DIR}/mp-units.html"
# Ensure the parent directory exists
mkdir -p "$(dirname "$SYMLINK_TARGET")"
# Create the symlink (remove existing one if present)
if ln -sf "$SYMLINK_SOURCE" "$SYMLINK_TARGET"; then
echo "Documentation symlink created: $SYMLINK_TARGET -> $SYMLINK_SOURCE"
else
echo "Warning: Failed to create documentation symlink" >&2
fi
# Build documentation if requested
if [[ "$BUILD_DOCS" == true ]]; then
echo "Building API reference documentation..."
# Set proper locale environment for the build
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
# Create log file with timestamp
LOG_FILE="$BUILD_DIR/api_reference_build_$(date +%Y%m%d_%H%M%S).log"
echo "Build output will be logged to: $LOG_FILE"
# Use tee to show output on console and save to log file
cmake --build "$BUILD_DIR" 2>&1 | tee "$LOG_FILE"
# Check if build was successful
if [[ ${PIPESTATUS[0]} -eq 0 ]]; then
echo "API reference documentation build completed successfully."
else
echo "API reference documentation build failed. Check the log file: $LOG_FILE"
exit 1
fi
else
echo "To build the documentation only (without setup), run:"
echo " cmake --build $BUILD_DIR"
echo "Or use: $0 (without -s option)"
fi
echo "API reference setup completed successfully."