mirror of
https://github.com/mpusz/mp-units.git
synced 2025-12-23 07:12:35 +01:00
166 lines
5.3 KiB
Bash
Executable File
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."
|