Skip to content

Commit 219221c

Browse files
committed
Enhance CMake functionality and improve error messaging
- Updated regex handling in cpp_library_setup to correctly escape namespace prefixes when calculating clean names. - Refined version extraction logic in dependency provider to enforce semantic versioning format. - Improved error messages in dependency resolution to clarify common issues and provide guidance on correct usage. - Expanded unit test documentation to reflect the interaction between dependency tracking and custom mappings. These changes enhance the clarity and robustness of the CMake configuration for the cpp-library.
1 parent 3d75542 commit 219221c

5 files changed

Lines changed: 23 additions & 13 deletions

File tree

cmake/cpp-library-dependency-provider.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,10 @@ function(_cpp_library_track_find_package package_name)
6262
cmake_parse_arguments(FP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
6363

6464
# Extract version if present (first unparsed argument that looks like a version)
65+
# Pattern requires at least major.minor format (e.g., "1.2", "1.23", "1.2.3")
6566
set(VERSION "")
6667
foreach(arg IN LISTS FP_UNPARSED_ARGUMENTS)
67-
if(arg MATCHES "^[0-9]+\\.[0-9]")
68+
if(arg MATCHES "^[0-9]+\\.[0-9]+")
6869
set(VERSION "${arg}")
6970
break()
7071
endif()

cmake/cpp-library-install.cmake

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,18 @@ function(_cpp_library_resolve_dependency LIB NAMESPACE OUTPUT_VAR)
140140
# Provider is installed but dependency wasn't tracked
141141
message(FATAL_ERROR
142142
"cpp-library: Dependency ${LIB} (package: ${FIND_PACKAGE_NAME}) was not tracked.\n"
143-
"This may happen if:\n"
144-
" - The dependency was added after cpp_library_setup()\n"
145-
" - The dependency was added in a subdirectory\n"
146143
"\n"
147-
"Make sure all CPMAddPackage() and find_package() calls happen AFTER project()\n"
148-
"and BEFORE cpp_library_setup().\n"
144+
"The dependency provider is installed, but this dependency was not captured.\n"
145+
"Common causes:\n"
146+
" - find_package() or CPMAddPackage() was called AFTER cpp_library_setup()\n"
147+
" - Dependency was added in a subdirectory with separate scope\n"
148+
"\n"
149+
"Solution: Ensure all dependencies are declared AFTER project() and BEFORE cpp_library_setup().\n"
150+
"\n"
151+
"Correct order:\n"
152+
" project(my-library)\n"
153+
" find_package(SomePackage) # or CPMAddPackage(...)\n"
154+
" cpp_library_setup(...) # Must come after all dependencies\n"
149155
)
150156
endif()
151157
endif()
@@ -186,9 +192,9 @@ function(_cpp_library_add_dependency FIND_DEP_ARGS)
186192
set(REMAINING_ARGS "")
187193
endif()
188194

189-
# Extract version (first token that looks like a version number)
195+
# Extract version (first token that looks like a semantic version number: major.minor[.patch]...)
190196
set(VERSION "")
191-
if(REMAINING_ARGS MATCHES "^([0-9][0-9.]*)")
197+
if(REMAINING_ARGS MATCHES "^([0-9]+\\.[0-9]+(?:\\.[0-9]+)*)")
192198
set(VERSION "${CMAKE_MATCH_1}")
193199
# Remove version from args - use substring to avoid regex issues with dots
194200
string(LENGTH "${VERSION}" VERSION_LEN)

cpp-library.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ function(cpp_library_setup)
170170

171171
# Calculate clean name (without namespace prefix) for target alias
172172
# If PROJECT_NAME starts with NAMESPACE-, strip it; otherwise use PROJECT_NAME as-is
173-
string(REGEX REPLACE "^${ARG_NAMESPACE}-" "" CLEAN_NAME "${ARG_NAME}")
173+
string(REGEX ESCAPE "${ARG_NAMESPACE}" ESCAPED_NAMESPACE)
174+
string(REGEX REPLACE "^${ESCAPED_NAMESPACE}-" "" CLEAN_NAME "${ARG_NAME}")
174175

175176
# Always prefix package name with namespace for collision prevention
176177
# Special case: if namespace equals clean name, don't duplicate (e.g., stlab::stlab → stlab)

templates/.github/workflows/ci.yml.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,9 @@ jobs:
119119
steps:
120120
- uses: actions/checkout@v5
121121

122+
# ssciwr/doxygen-install@1.6.4
122123
- name: Install Doxygen
123-
uses: ssciwr/doxygen-install@v1
124+
uses: ssciwr/doxygen-install@501e53b879da7648ab392ee226f5b90e42148449
124125

125126
- name: Configure CMake
126127
run: cmake --preset=docs

tests/install/test_dependency_provider.cmake

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# SPDX-License-Identifier: BSL-1.0
22
#
3-
# Unit tests for dependency provider tracking
4-
# These tests verify that the dependency provider correctly tracks dependencies
5-
3+
# Unit tests for dependency provider tracking and its interaction with dependency mapping
4+
# These tests verify that the dependency provider correctly tracks dependencies and that
5+
# tracked dependencies interact properly with custom mappings and system packages.
6+
#
67
# Note: We can't actually test the provider installation itself in these unit tests
78
# since that requires being called during project(). Instead, we test the tracking
89
# functions directly and simulate tracked dependencies.

0 commit comments

Comments
 (0)