From 844cb56c8cb98c2b43c87d2e70cc47acedaad4bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Lindel=C3=B6w?= Date: Mon, 6 Apr 2026 16:56:00 +0200 Subject: [PATCH] Add generate_version cmake target --- .github/workflows/ci.yml | 9 +++++++ CMakeLists.txt | 12 ++++++++- cmake/GenerateVersion.cmake | 51 +++++++++++++++++++++++++++++++++++++ include/tinycsocket.h | 2 +- src/tinycsocket_internal.h | 2 +- tools/check_version.sh | 22 ++++++++++++++++ 6 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 cmake/GenerateVersion.cmake create mode 100755 tools/check_version.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc967a8..6ddcb6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,6 +42,15 @@ jobs: - name: Check header is up to date run: ./tools/is_header_up_to_date.sh + version-updated: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Check version is up to date + run: ./tools/check_version.sh + posix-coverage: runs-on: ubuntu-latest steps: diff --git a/CMakeLists.txt b/CMakeLists.txt index ca204fc..73e9a32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.10) # CMake fix for crosscompile (MinGW-w64) set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") -project(tinycsocket VERSION 0.4) +project(tinycsocket) include(CheckSymbolExists) include(CheckIncludeFile) @@ -69,6 +69,15 @@ set(TINYCSOCKET_SRC "src/tinycsocket_posix.c" ) +# Version generation +add_custom_target( + generate_version + COMMAND ${CMAKE_COMMAND} -DSRC_DIR=${CMAKE_CURRENT_SOURCE_DIR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateVersion.cmake + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) +set_target_properties(generate_version PROPERTIES FOLDER tinycsocket) + # Header generation add_custom_command( OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/tinycsocket.h @@ -81,6 +90,7 @@ add_custom_command( add_custom_target( generate_header SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/include/tinycsocket.h + DEPENDS generate_version ) set_target_properties(generate_header PROPERTIES FOLDER tinycsocket) diff --git a/cmake/GenerateVersion.cmake b/cmake/GenerateVersion.cmake new file mode 100644 index 0000000..9596454 --- /dev/null +++ b/cmake/GenerateVersion.cmake @@ -0,0 +1,51 @@ +# Generates TCS_VERSION_TXT from git tag + commit count. +# Format: {tag}.{count} + +find_package(Git QUIET) +if(NOT GIT_FOUND) + message(WARNING "Git not found, skipping version generation") + return() +endif() + +# Get latest tag +execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --tags --abbrev=0 + WORKING_DIRECTORY "${SRC_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE tag + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + +if(NOT res EQUAL 0) + message(WARNING "No git tags found, skipping version generation") + return() +endif() + +# Count commits since tag +execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-list --count "${tag}..HEAD" + WORKING_DIRECTORY "${SRC_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE count + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + +if(NOT res EQUAL 0) + set(count "0") +endif() + +set(version "${tag}.${count}") + +# Update header +set(HEADER_FILE "${SRC_DIR}/src/tinycsocket_internal.h") +file(READ "${HEADER_FILE}" content) + +string(REGEX REPLACE + "(static const char\\* const TCS_VERSION_TXT = \")[^\"]*(\")" + "\\1${version}\\2" + new_content "${content}") + +if(NOT "${content}" STREQUAL "${new_content}") + file(WRITE "${HEADER_FILE}" "${new_content}") + message(STATUS "Updated TCS_VERSION_TXT to \"${version}\"") +else() + message(STATUS "TCS_VERSION_TXT already \"${version}\"") +endif() diff --git a/include/tinycsocket.h b/include/tinycsocket.h index 228075e..99b875b 100644 --- a/include/tinycsocket.h +++ b/include/tinycsocket.h @@ -35,7 +35,7 @@ #define tcs_static_assert(name, expr) typedef char tcs_sa_##name[(expr) ? 1 : -1] -static const char* const TCS_VERSION_TXT = "v0.4-dev"; +static const char* const TCS_VERSION_TXT = "v0.3.175"; static const char* const TCS_LICENSE_TXT = "Copyright 2018 Markus Lindelöw\n" "\n" diff --git a/src/tinycsocket_internal.h b/src/tinycsocket_internal.h index 50cc582..ef10bec 100644 --- a/src/tinycsocket_internal.h +++ b/src/tinycsocket_internal.h @@ -29,7 +29,7 @@ #define tcs_static_assert(name, expr) typedef char tcs_sa_##name[(expr) ? 1 : -1] -static const char* const TCS_VERSION_TXT = "v0.4-dev"; +static const char* const TCS_VERSION_TXT = "v0.3.175"; static const char* const TCS_LICENSE_TXT = "Copyright 2018 Markus Lindelöw\n" "\n" diff --git a/tools/check_version.sh b/tools/check_version.sh new file mode 100755 index 0000000..a3b0dcb --- /dev/null +++ b/tools/check_version.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# Verifies that TCS_VERSION_TXT matches what generate_version would produce. +# Returns 0 if up to date. +set -e + +PROJPATH="$(dirname "$(readlink -f "$0")")"/.. + +# Get expected version +TAG=$(git -C "$PROJPATH" describe --tags --abbrev=0) +COUNT=$(git -C "$PROJPATH" rev-list --count "$TAG..HEAD") +EXPECTED="${TAG}.${COUNT}" + +# Get actual version from header +ACTUAL=$(grep 'TCS_VERSION_TXT' "$PROJPATH/src/tinycsocket_internal.h" | sed 's/.*"\(.*\)".*/\1/') + +if [ "$EXPECTED" != "$ACTUAL" ]; then + echo "Version mismatch: header has \"$ACTUAL\", expected \"$EXPECTED\"" + echo "Run: cmake --build . --target generate_version" + exit 1 +fi + +echo "Version OK: $ACTUAL"