From 93ca1debd129aacc30b910bca0259c2bec253c8a Mon Sep 17 00:00:00 2001 From: Growl Date: Fri, 26 Jun 2026 07:43:03 +0800 Subject: [PATCH] Use VERSION as the canonical project version --- CMakeLists.txt | 17 ++++++++++-- Makefile | 3 +-- VERSION | 1 + scripts/tool_pkgversion.sh | 16 ++++++----- scripts/tool_version.sh | 54 ++++++++++++++++++++++++-------------- 5 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 VERSION diff --git a/CMakeLists.txt b/CMakeLists.txt index 5acfe37e1..3efb60f40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,19 @@ cmake_minimum_required(VERSION 3.13 FATAL_ERROR) +set(LIBXS_VERSION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/VERSION") +if(NOT EXISTS "${LIBXS_VERSION_FILE}") + message(FATAL_ERROR "Missing ${LIBXS_VERSION_FILE}") +endif() + +file(READ "${LIBXS_VERSION_FILE}" LIBXS_VERSION) +string(STRIP "${LIBXS_VERSION}" LIBXS_VERSION) +if(NOT LIBXS_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+$") + message(FATAL_ERROR + "Invalid version '${LIBXS_VERSION}' in ${LIBXS_VERSION_FILE}; expected MAJOR.MINOR.PATCH") +endif() + project(libxs - VERSION 1.0.0 + VERSION "${LIBXS_VERSION}" LANGUAGES C) include(GNUInstallDirs) @@ -57,8 +69,9 @@ if(NOT LIBXS_VERSION_RC EQUAL 0) message(FATAL_ERROR "tool_version.sh failed with code ${LIBXS_VERSION_RC}") endif() -# Re-run on reconfigure whenever the script changes +# Re-run on reconfigure whenever version metadata changes. set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + "${LIBXS_VERSION_FILE}" "${LIBXS_VERSION_SCRIPT}") set(THREADS_PREFER_PTHREAD_FLAG ON) diff --git a/Makefile b/Makefile index 32e3ec497..7dda1ba7d 100644 --- a/Makefile +++ b/Makefile @@ -234,7 +234,7 @@ winterface: headers sources .PHONY: config config: $(INCDIR)/$(PROJECT)_version.h -$(INCDIR)/$(PROJECT)_version.h: $(INCDIR)/.make $(DIRSTATE)/.state $(ROOTSCR)/tool_version.sh +$(INCDIR)/$(PROJECT)_version.h: $(INCDIR)/.make $(DIRSTATE)/.state $(ROOTDIR)/VERSION $(ROOTSCR)/tool_version.sh $(information) $(info --- $(PROJUPP) build log) @$(CP) -r $(ROOTSCR) . 2>/dev/null || true @@ -245,7 +245,6 @@ $(INCDIR)/$(PROJECT)_version.h: $(INCDIR)/.make $(DIRSTATE)/.state $(ROOTSCR)/to @$(CP) $(HEADERS_MAIN) $(INCDIR) 2>/dev/null || true @$(CP) $(SRCFILES) $(HEADERS_SRC) $(SRCDIR) 2>/dev/null || true @$(ROOTSCR)/tool_version.sh $(PROJECT) -1 >$@ - @$(SED) 's/^\( VERSION \)[0-9][0-9.]*/\1$(VERSION_STRING)/' $(ROOTDIR)/CMakeLists.txt >$(ROOTDIR)/CMakeLists.tmp 2>/dev/null && mv $(ROOTDIR)/CMakeLists.tmp $(ROOTDIR)/CMakeLists.txt || true @$(ROOTSCR)/tool_pkgversion.sh 2>/dev/null || true .PHONY: cheader diff --git a/VERSION b/VERSION new file mode 100644 index 000000000..3eefcb9dd --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.0 diff --git a/scripts/tool_pkgversion.sh b/scripts/tool_pkgversion.sh index 5eed5e87a..208a24645 100755 --- a/scripts/tool_pkgversion.sh +++ b/scripts/tool_pkgversion.sh @@ -6,8 +6,8 @@ # SPDX-License-Identifier: BSD-3-Clause # ############################################################################### # Synchronize packaging metadata (RPM spec, Debian changelog) with the -# project version from CMakeLists.txt. Only patches when the version -# actually changed. Run from the repository root: +# project version from VERSION. Only patches when the version actually +# changed. Run from the repository root: # sh scripts/tool_pkgversion.sh ############################################################################### SED=$(command -v sed) @@ -21,11 +21,15 @@ fi HERE=$(cd "$(dirname "$0")" && pwd) ROOT=$(cd "${HERE}/.." && pwd) -VERSION=$(${GREP} -m1 '^\s*VERSION' "${ROOT}/CMakeLists.txt" \ - | ${SED} 's/[^0-9.]//g') +VERSION_FILE="${ROOT}/VERSION" +if [ ! -r "${VERSION_FILE}" ]; then + >&2 echo "ERROR: missing ${VERSION_FILE}" + exit 1 +fi -if [ -z "${VERSION}" ]; then - >&2 echo "ERROR: cannot extract VERSION from CMakeLists.txt" +VERSION=$(${SED} -n '1{s/\r$//;p;}' "${VERSION_FILE}") +if ! printf '%s\n' "${VERSION}" | ${GREP} -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then + >&2 echo "ERROR: invalid version '${VERSION}' in ${VERSION_FILE}" exit 1 fi diff --git a/scripts/tool_version.sh b/scripts/tool_version.sh index 83fc12fec..33d89f7b3 100755 --- a/scripts/tool_version.sh +++ b/scripts/tool_version.sh @@ -5,34 +5,48 @@ # For information on the license, see the LICENSE file. # # SPDX-License-Identifier: BSD-3-Clause # ############################################################################### -SORT=$(command -v sort) HEAD=$(command -v head) CUT=$(command -v cut) GIT=$(command -v git) TR=$(command -v tr) +GREP=$(command -v grep) PRFIX=$1 CMPNT=${2:-0} SHIFT=${3:-0} -if [ ! "${SORT}" ] || [ ! "${HEAD}" ] || [ ! "${CUT}" ] || [ ! "${TR}" ]; then +if [ ! "${HEAD}" ] || [ ! "${CUT}" ] || [ ! "${TR}" ] || [ ! "${GREP}" ]; then >&2 echo "ERROR: missing prerequisites!" exit 1 fi +ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) || exit 1 +VERSION_FILE="${ROOT}/VERSION" +if [ ! -r "${VERSION_FILE}" ]; then + >&2 echo "ERROR: missing ${VERSION_FILE}!" + exit 1 +fi + +VERSION_BASE=$(${HEAD} -n1 "${VERSION_FILE}" | ${TR} -d '\r') +if ! printf '%s\n' "${VERSION_BASE}" | ${GREP} -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then + >&2 echo "ERROR: invalid version '${VERSION_BASE}' in ${VERSION_FILE}; expected MAJOR.MINOR.PATCH" + exit 1 +fi + if [ "${PRFIX}" ]; then PREFIX="$(echo "${PRFIX}_" | ${TR} a-z A-Z)" fi -TAG=$(${GIT} tag 2>/dev/null | ${SORT} -nr -t. -k1,1 -k2,2 -k3,3 | ${HEAD} -n1) -BRANCH=$(${GIT} rev-parse --abbrev-ref HEAD 2>/dev/null) - -if [ "${TAG}" ]; then - REVC=$(${GIT} rev-list --count --no-merges "${TAG}"..HEAD 2>/dev/null) - BASE="-${TAG}" -else - REVC=$(${GIT} rev-list --count --no-merges HEAD 2>/dev/null) - BASE="" +BRANCH= +REVC=0 +if [ "${GIT}" ] && ${GIT} -C "${ROOT}" rev-parse --is-inside-work-tree >/dev/null 2>&1; then + BRANCH=$(${GIT} -C "${ROOT}" rev-parse --abbrev-ref HEAD 2>/dev/null) + ANCHOR=$(${GIT} -C "${ROOT}" describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*' 2>/dev/null) + if [ "${ANCHOR}" ]; then + REVC=$(${GIT} -C "${ROOT}" rev-list --count --no-merges "${ANCHOR}"..HEAD 2>/dev/null) + else + REVC=$(${GIT} -C "${ROOT}" rev-list --count --no-merges HEAD 2>/dev/null) + fi fi PATCH=$((${REVC:-0}+SHIFT)) @@ -41,16 +55,16 @@ if [ "0" != "${PATCH}" ]; then fi if [ "0" = "${CMPNT}" ]; then - echo "${BRANCH}${BASE}${EXT}" -elif [ "0" != "$((0>CMPNT))" ]; then - MAJOR=$(echo "${TAG}" | ${CUT} -d. -f1) - MINOR=$(echo "${TAG}" | ${CUT} -d. -f2) - UPDTE=$(echo "${TAG}" | ${CUT} -d. -f3) - if [ "${TAG}" ]; then - VERSION="${TAG}${EXT}" + if [ "${BRANCH}" ]; then + echo "${BRANCH}-${VERSION_BASE}${EXT}" else - VERSION="${PATCH}" + echo "${VERSION_BASE}${EXT}" fi +elif [ "0" != "$((0>CMPNT))" ]; then + MAJOR=$(echo "${VERSION_BASE}" | ${CUT} -d. -f1) + MINOR=$(echo "${VERSION_BASE}" | ${CUT} -d. -f2) + UPDTE=$(echo "${VERSION_BASE}" | ${CUT} -d. -f3) + VERSION="${VERSION_BASE}${EXT}" echo "#ifndef ${PREFIX}VERSION_H" echo "#define ${PREFIX}VERSION_H" echo @@ -64,7 +78,7 @@ elif [ "0" != "$((0>CMPNT))" ]; then echo echo "#endif" elif [ "0" != "$((3>=CMPNT))" ]; then - VALUE=$(echo "${TAG}" | ${CUT} -d. -f"${CMPNT}") + VALUE=$(echo "${VERSION_BASE}" | ${CUT} -d. -f"${CMPNT}") echo "${VALUE:-0}" else echo "${PATCH}"