5858endif ()
5959
6060# Use cached cmkr if found
61- if (DEFINED ENV{CMKR_CACHE} AND EXISTS " $ENV{CMKR_CACHE} " )
61+ if (DEFINED ENV{CMKR_CACHE})
6262 set (CMKR_DIRECTORY_PREFIX "$ENV{CMKR_CACHE} " )
6363 string (REPLACE "\\ " "/" CMKR_DIRECTORY_PREFIX "${CMKR_DIRECTORY_PREFIX} " )
6464 if (NOT CMKR_DIRECTORY_PREFIX MATCHES "\\ /$" )
@@ -72,10 +72,27 @@ endif()
7272set (CMKR_DIRECTORY "${CMKR_DIRECTORY_PREFIX}${CMKR_TAG} " )
7373set (CMKR_CACHED_EXECUTABLE "${CMKR_DIRECTORY} /bin/${CMKR_EXECUTABLE_NAME} " )
7474
75+ # Helper function to check if a string starts with a prefix
76+ # Cannot use MATCHES, see: https://github.com/build-cpp/cmkr/issues/61
77+ function (cmkr_startswith str prefix result)
78+ string (LENGTH "${prefix} " prefix_length)
79+ string (LENGTH "${str} " str_length)
80+ if (prefix_length LESS_EQUAL str_length)
81+ string (SUBSTRING "${str} " 0 ${prefix_length} str_prefix)
82+ if (prefix STREQUAL str_prefix)
83+ set ("${result} " ON PARENT_SCOPE)
84+ return ()
85+ endif ()
86+ endif ()
87+ set ("${result} " OFF PARENT_SCOPE)
88+ endfunction ()
89+
7590# Handle upgrading logic
7691if (CMKR_EXECUTABLE AND NOT CMKR_CACHED_EXECUTABLE STREQUAL CMKR_EXECUTABLE)
77- if (CMKR_EXECUTABLE MATCHES "^${CMAKE_CURRENT_BINARY_DIR} /_cmkr" )
78- if (DEFINED ENV{CMKR_CACHE} AND EXISTS "$ENV{CMKR_CACHE} " )
92+ cmkr_startswith("${CMKR_EXECUTABLE} " "${CMAKE_CURRENT_BINARY_DIR} /_cmkr" CMKR_STARTSWITH_BUILD)
93+ cmkr_startswith("${CMKR_EXECUTABLE} " "${CMKR_DIRECTORY_PREFIX} " CMKR_STARTSWITH_CACHE)
94+ if (CMKR_STARTSWITH_BUILD)
95+ if (DEFINED ENV{CMKR_CACHE})
7996 message (AUTHOR_WARNING "[cmkr] Switching to cached cmkr: '${CMKR_CACHED_EXECUTABLE} '" )
8097 if (EXISTS "${CMKR_CACHED_EXECUTABLE} " )
8198 set (CMKR_EXECUTABLE "${CMKR_CACHED_EXECUTABLE} " CACHE FILEPATH "Full path to cmkr executable" FORCE)
@@ -86,7 +103,7 @@ if(CMKR_EXECUTABLE AND NOT CMKR_CACHED_EXECUTABLE STREQUAL CMKR_EXECUTABLE)
86103 message (AUTHOR_WARNING "[cmkr] Upgrading '${CMKR_EXECUTABLE} ' to '${CMKR_CACHED_EXECUTABLE} '" )
87104 unset (CMKR_EXECUTABLE CACHE )
88105 endif ()
89- elseif (DEFINED ENV{CMKR_CACHE} AND EXISTS " $ENV{CMKR_CACHE} " AND CMKR_EXECUTABLE MATCHES "^ ${CMKR_DIRECTORY_PREFIX} " )
106+ elseif (DEFINED ENV{CMKR_CACHE} AND CMKR_STARTSWITH_CACHE )
90107 message (AUTHOR_WARNING "[cmkr] Upgrading cached '${CMKR_EXECUTABLE} ' to '${CMKR_CACHED_EXECUTABLE} '" )
91108 unset (CMKR_EXECUTABLE CACHE )
92109 endif ()
0 commit comments