#!/usr/bin/env bash
# ==========================================================================
#              ____        _ _     _     _____           _
#             | __ ) _   _(_) | __| |   |_   _|__   ___ | |___
#             |  _ \| | | | | |/ _` |_____| |/ _ \ / _ \| / __|
#             | |_) | |_| | | | (_| |_____| | (_) | (_) | \__ \
#             |____/ \__,_|_|_|\__,_|     |_|\___/ \___/|_|___/
#
#                           --- Build-Tools ---
#                https://www.nntb.no/~dreibh/system-tools/
# ==========================================================================
#
# Determine project version from CMake project's CMakeCache.txt
# Copyright (C) 2026 by Thomas Dreibholz
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: thomas.dreibholz@gmail.com

# Bash options:
set -euo pipefail

if [ ! -e "CMakeCache.txt" ] ; then
   echo >&2 "ERROR: Failed to open CMakeCache.txt; the project needs to be configured first!"
   exit 1
fi

grep "^CMAKE_PROJECT_" CMakeCache.txt | (
   PROJECT_NAME=""
   PROJECT_VERSION_MAJOR=""
   PROJECT_VERSION_MINOR=""
   PROJECT_VERSION_PATCH=""
   PROJECT_VERSION_TWEAK=""
   while read -r line ; do
      if [[ "${line}" =~ ^(CMAKE_PROJECT_NAME:)(STATIC)(=)([^\s]+)([\s]*)$ ]] ; then
         PROJECT_NAME="${BASH_REMATCH[4]}"
      elif [[ "${line}" =~ ^(CMAKE_PROJECT_VERSION_MAJOR:)(STATIC)(=)([0-9]+)([\s]*)$ ]] ; then
         PROJECT_VERSION_MAJOR="${BASH_REMATCH[4]}"
      elif [[ "${line}" =~ ^(CMAKE_PROJECT_VERSION_MINOR:)(STATIC)(=)([0-9]+)([\s]*)$ ]] ; then
         PROJECT_VERSION_MINOR="${BASH_REMATCH[4]}"
      elif [[ "${line}" =~ ^(CMAKE_PROJECT_VERSION_PATCH:)(STATIC)(=)([^\s]+)([\s]*)$ ]] ; then
         PROJECT_VERSION_PATCH="${BASH_REMATCH[4]}"
      elif [[ "${line}" =~ ^(CMAKE_PROJECT_VERSION_TWEAK:)(STATIC)(=)([^\s]+)([\s]*)$ ]] ; then
         PROJECT_VERSION_TWEAK="${BASH_REMATCH[4]}"
      fi
   done
   if [ "${PROJECT_NAME}" == "" ] ||
      [ "${PROJECT_VERSION_MAJOR}" == "" ] ||
      [ "${PROJECT_VERSION_MINOR}" == "" ] ||
      [ "${PROJECT_VERSION_PATCH}" == "" ]; then
      echo >&2 "ERROR: Unable to determine project version from CMakeCache.txt!"
      exit 1
   fi
   if [ "${PROJECT_VERSION_TWEAK}" != "" ] ; then
      echo "${PROJECT_NAME} ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}"
   else
      echo "${PROJECT_NAME} ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
   fi
)
