diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c306b27..49b02c4 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 8bd7c75..d277675 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,8 +3,6 @@ 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) - include(CheckSymbolExists) include(CheckIncludeFile) @@ -69,6 +67,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 +88,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) @@ -110,9 +118,6 @@ if(TCS_WARNINGS_AS_ERRORS) endif() endif() -install(TARGETS tinycsocket DESTINATION lib) -install(FILES include/tinycsocket.h DESTINATION include) - # Extra targets for development if(TCS_ENABLE_TESTS) enable_testing() diff --git a/cmake/GenerateVersion.cmake b/cmake/GenerateVersion.cmake new file mode 100644 index 0000000..bfce476 --- /dev/null +++ b/cmake/GenerateVersion.cmake @@ -0,0 +1,63 @@ +# Generates TCS_VERSION_TXT from git tag + first-parent 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 first-parent commits on master since tag +execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-list --count --first-parent "${tag}..origin/master" + 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() + +# If not on master, add 1 to anticipate the merge commit +execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY "${SRC_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE branch + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + +if(NOT "${branch}" STREQUAL "master") + math(EXPR count "${count} + 1") +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..fa2aaeb 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.56"; 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..b21bf6f 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.56"; 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..b186c38 --- /dev/null +++ b/tools/check_version.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# Verifies TCS_VERSION_TXT matches git. Format: . +set -e + +PROJPATH="$(dirname "$(readlink -f "$0")")"/.. +TAG=$(git -C "$PROJPATH" describe --tags --abbrev=0) +ACTUAL=$(grep 'const TCS_VERSION_TXT =' "$PROJPATH/src/tinycsocket_internal.h" | sed 's/.*"\(.*\)".*/\1/') + +if [ "${GITHUB_REF:-}" = "refs/heads/master" ]; then + COUNT=$(git -C "$PROJPATH" rev-list --count --first-parent "$TAG..HEAD") +else + COUNT=$(( $(git -C "$PROJPATH" rev-list --count --first-parent "$TAG..origin/master") + 1 )) +fi + +EXPECTED="${TAG}.${COUNT}" + +if [ "$ACTUAL" != "$EXPECTED" ]; then + echo "Version mismatch: header has \"$ACTUAL\", expected \"$EXPECTED\"" + exit 1 +fi + +echo "Version OK: $ACTUAL"