Skip to content

Commit b756671

Browse files
Copilotsean-parent
andauthored
fix setup version fallback for standalone quick-start script
Agent-Logs-Url: https://github.com/stlab/cpp-library/sessions/3f8652a3-2a74-48f7-94f1-7102987d4f18 Co-authored-by: sean-parent <2279724+sean-parent@users.noreply.github.com>
1 parent f1bc983 commit b756671

3 files changed

Lines changed: 85 additions & 8 deletions

File tree

.github/workflows/ci.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ jobs:
2222
- name: Run provider merging tests
2323
run: cmake -P tests/install/test_provider_merge.cmake
2424

25+
- name: Run setup.cmake version resolution test
26+
run: cmake -P tests/setup/test_setup_version_resolution.cmake
27+
2528
integration-tests:
2629
name: Integration Tests
2730
runs-on: ubuntu-latest
@@ -152,4 +155,3 @@ jobs:
152155
test -f templates/Doxyfile.in
153156
test -f templates/custom.css
154157
echo "✓ All template files present"
155-

setup.cmake

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,54 @@
99

1010
cmake_minimum_required(VERSION 3.20)
1111

12-
# Detect cpp-library version from git tags
12+
# Extract latest semantic version from a list of refs/tags/vX.Y.Z entries
13+
function(extract_latest_cpp_library_version_from_tags TAG_REFS OUTPUT_VAR)
14+
string(REGEX MATCHALL "refs/tags/v[0-9]+\\.[0-9]+\\.[0-9]+" TAG_REFS_MATCHES "${TAG_REFS}")
15+
16+
set(SEMVER_TAGS "")
17+
foreach(tag_ref IN LISTS TAG_REFS_MATCHES)
18+
string(REGEX REPLACE "^refs/tags/v" "" semver "${tag_ref}")
19+
list(APPEND SEMVER_TAGS "${semver}")
20+
endforeach()
21+
22+
if(SEMVER_TAGS)
23+
list(REMOVE_DUPLICATES SEMVER_TAGS)
24+
list(SORT SEMVER_TAGS COMPARE NATURAL ORDER DESCENDING)
25+
list(GET SEMVER_TAGS 0 latest_version)
26+
set(${OUTPUT_VAR} "${latest_version}" PARENT_SCOPE)
27+
else()
28+
set(${OUTPUT_VAR} "" PARENT_SCOPE)
29+
endif()
30+
endfunction()
31+
32+
# Detect cpp-library version from local git tags first
33+
set(CPP_LIBRARY_VERSION "")
1334
execute_process(
1435
COMMAND git describe --tags --abbrev=0
1536
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
1637
OUTPUT_VARIABLE CPP_LIBRARY_GIT_VERSION
1738
OUTPUT_STRIP_TRAILING_WHITESPACE
1839
ERROR_QUIET
1940
)
20-
21-
# Clean version (remove 'v' prefix if present)
2241
if(CPP_LIBRARY_GIT_VERSION)
2342
string(REGEX REPLACE "^v" "" CPP_LIBRARY_VERSION "${CPP_LIBRARY_GIT_VERSION}")
24-
else()
25-
# Fallback to X.Y.Z placeholder if no git tag found
26-
set(CPP_LIBRARY_VERSION "X.Y.Z")
27-
message(WARNING "No git tag found for cpp-library version. Using placeholder 'X.Y.Z'. Check https://github.com/stlab/cpp-library/releases for the latest version.")
43+
endif()
44+
45+
# If setup.cmake is downloaded standalone (no local tags), detect from remote tags
46+
if(NOT CPP_LIBRARY_VERSION)
47+
execute_process(
48+
COMMAND git ls-remote --tags --refs https://github.com/stlab/cpp-library.git v[0-9]*
49+
OUTPUT_VARIABLE CPP_LIBRARY_REMOTE_TAGS
50+
OUTPUT_STRIP_TRAILING_WHITESPACE
51+
ERROR_QUIET
52+
)
53+
extract_latest_cpp_library_version_from_tags("${CPP_LIBRARY_REMOTE_TAGS}" CPP_LIBRARY_VERSION)
54+
endif()
55+
56+
# Last-resort fallback to main branch so initialization still works
57+
if(NOT CPP_LIBRARY_VERSION)
58+
set(CPP_LIBRARY_VERSION "main")
59+
message(WARNING "No git tag found for cpp-library version. Falling back to branch 'main'.")
2860
endif()
2961

3062
message(STATUS "cpp-library version: ${CPP_LIBRARY_VERSION}")
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# SPDX-License-Identifier: BSL-1.0
2+
#
3+
# Integration test for setup.cmake version detection when run standalone
4+
#
5+
# Run as: cmake -P tests/setup/test_setup_version_resolution.cmake
6+
7+
cmake_minimum_required(VERSION 3.20)
8+
9+
set(TEST_ROOT_DIR "/tmp/cpp-library-setup-version-test")
10+
set(TEST_PROJECT_NAME "setup-version-test-lib")
11+
12+
file(REMOVE_RECURSE "${TEST_ROOT_DIR}")
13+
file(MAKE_DIRECTORY "${TEST_ROOT_DIR}")
14+
file(COPY "${CMAKE_CURRENT_LIST_DIR}/../../setup.cmake" DESTINATION "${TEST_ROOT_DIR}")
15+
16+
execute_process(
17+
COMMAND ${CMAKE_COMMAND} -P setup.cmake -- --name=${TEST_PROJECT_NAME} --namespace=testns --description=test --header-only=yes --examples=no --tests=no
18+
WORKING_DIRECTORY "${TEST_ROOT_DIR}"
19+
RESULT_VARIABLE SETUP_RESULT
20+
OUTPUT_VARIABLE SETUP_OUTPUT
21+
ERROR_VARIABLE SETUP_ERROR
22+
)
23+
24+
if(NOT SETUP_RESULT EQUAL 0)
25+
message(FATAL_ERROR "setup.cmake failed with exit code ${SETUP_RESULT}\nstdout:\n${SETUP_OUTPUT}\nstderr:\n${SETUP_ERROR}")
26+
endif()
27+
28+
set(GENERATED_CMAKE_LISTS "${TEST_ROOT_DIR}/${TEST_PROJECT_NAME}/CMakeLists.txt")
29+
if(NOT EXISTS "${GENERATED_CMAKE_LISTS}")
30+
message(FATAL_ERROR "Generated CMakeLists.txt not found: ${GENERATED_CMAKE_LISTS}")
31+
endif()
32+
33+
file(READ "${GENERATED_CMAKE_LISTS}" GENERATED_CONTENT)
34+
35+
if(GENERATED_CONTENT MATCHES "CPMAddPackage\\(\"gh:stlab/cpp-library@X\\.Y\\.Z\"\\)")
36+
message(FATAL_ERROR "setup.cmake generated placeholder version X.Y.Z, which should never be emitted.")
37+
endif()
38+
39+
if(NOT GENERATED_CONTENT MATCHES "CPMAddPackage\\(\"gh:stlab/cpp-library@([0-9]+\\.[0-9]+\\.[0-9]+|main)\"\\)")
40+
message(FATAL_ERROR "setup.cmake generated invalid cpp-library version reference in CPMAddPackage.")
41+
endif()
42+
43+
message(STATUS "✓ setup.cmake generated a valid cpp-library version reference")

0 commit comments

Comments
 (0)