3# Helper to ensure ALib sources are available locally.
5# include("${CMAKE_CURRENT_LIST_DIR}/cmake/ALibFetch.cmake")
6# ALibEnsureSourceAvailable(
9# # FETCH_ROOT "/path/to/cache"
10# # DOWNLOAD_TIMEOUT 60
13# # OUT_BASE_DIR ALIB_BASE_DIR_LOCAL
15# include("${ALIB_BASE_DIR}/build/cmake/ALib.cmake")
21function(ALibEnsureSourceAvailable)
23 set(_one_value VERSION_TAG FETCH_ROOT DOWNLOAD_TIMEOUT SHA256 OUT_BASE_DIR)
24 cmake_parse_arguments(ALIB_FETCH "${_opts}" "${_one_value}" "" ${ARGN})
26 # Respect a pre-set ALIB_BASE_DIR if it points to a valid ALib source tree.
27 if(DEFINED ALIB_BASE_DIR
28 AND EXISTS "${ALIB_BASE_DIR}/src/ALib.Lang.H"
29 AND EXISTS "${ALIB_BASE_DIR}/src/alib")
30 if(ALIB_FETCH_OUT_BASE_DIR)
31 set(${ALIB_FETCH_OUT_BASE_DIR} "${ALIB_BASE_DIR}" PARENT_SCOPE)
36 # Resolve inputs from function arguments first, then from cache variables.
37 if(NOT ALIB_FETCH_VERSION_TAG)
38 if(DEFINED ALIB_FETCH_VERSION_TAG AND NOT "${ALIB_FETCH_VERSION_TAG}" STREQUAL "")
39 set(ALIB_FETCH_VERSION_TAG "${ALIB_FETCH_VERSION_TAG}")
42 if(NOT ALIB_FETCH_VERSION_TAG)
43 message(FATAL_ERROR "ALibEnsureSourceAvailable: missing VERSION_TAG (example: V2605R0).")
46 if(NOT ALIB_FETCH_FETCH_ROOT)
47 if(DEFINED ALIB_FETCH_ROOT AND NOT "${ALIB_FETCH_ROOT}" STREQUAL "")
48 set(ALIB_FETCH_FETCH_ROOT "${ALIB_FETCH_ROOT}")
51 if(NOT ALIB_FETCH_FETCH_ROOT)
53 if(DEFINED ENV{LocalAppData} AND NOT "$ENV{LocalAppData}" STREQUAL "")
54 set(ALIB_FETCH_FETCH_ROOT "$ENV{LocalAppData}/ALib")
56 set(ALIB_FETCH_FETCH_ROOT "$ENV{USERPROFILE}/.alib")
59 set(ALIB_FETCH_FETCH_ROOT "$ENV{HOME}/Library/ALib")
61 set(ALIB_FETCH_FETCH_ROOT "$ENV{HOME}/.cache/ALib")
65 if(NOT ALIB_FETCH_DOWNLOAD_TIMEOUT)
66 if(DEFINED ALIB_DOWNLOAD_TIMEOUT AND NOT "${ALIB_DOWNLOAD_TIMEOUT}" STREQUAL "")
67 set(ALIB_FETCH_DOWNLOAD_TIMEOUT "${ALIB_DOWNLOAD_TIMEOUT}")
69 set(ALIB_FETCH_DOWNLOAD_TIMEOUT 60)
73 if(NOT ALIB_FETCH_SHA256)
74 if(DEFINED ALIB_SHA256 AND NOT "${ALIB_SHA256}" STREQUAL "")
75 set(ALIB_FETCH_SHA256 "${ALIB_SHA256}")
79 # Support either QUIET argument or ALIB_FETCH_QUIET cache variable.
80 set(_alib_quiet "${ALIB_FETCH_QUIET}")
81 if(NOT _alib_quiet AND DEFINED ALIB_FETCH_QUIET AND ALIB_FETCH_QUIET)
85 set(_alib_tag_with_v "${ALIB_FETCH_VERSION_TAG}")
86 if(NOT _alib_tag_with_v MATCHES "^V")
87 set(_alib_tag_with_v "V${_alib_tag_with_v}")
89 set(_alib_tag_without_v "${_alib_tag_with_v}")
90 string(REGEX REPLACE "^V" "" _alib_tag_without_v "${_alib_tag_without_v}")
92 # GitHub archive extraction currently yields a top-level folder without leading 'V'
93 # (for tags like V2510R0 -> ALib-Class-Library-2510R0).
94 set(_alib_src_dir "${ALIB_FETCH_FETCH_ROOT}/ALib-Class-Library-${_alib_tag_without_v}")
96 if(EXISTS "${_alib_src_dir}/src/ALib.Lang.H" AND EXISTS "${_alib_src_dir}/src/alib")
97 set(ALIB_BASE_DIR "${_alib_src_dir}" CACHE PATH "Path to ALib sources" FORCE)
98 if(ALIB_FETCH_OUT_BASE_DIR)
99 set(${ALIB_FETCH_OUT_BASE_DIR} "${ALIB_BASE_DIR}" PARENT_SCOPE)
104 file(MAKE_DIRECTORY "${ALIB_FETCH_FETCH_ROOT}")
105 set(_zip "${ALIB_FETCH_FETCH_ROOT}/ALib-${ALIB_FETCH_VERSION_TAG}.zip")
106 set(_url "https://github.com/AlexWorx/ALib-Class-Library/archive/refs/tags/${ALIB_FETCH_VERSION_TAG}.zip")
108 set(_dl_args SHOW_PROGRESS)
114 message(STATUS "Downloading ALib ${ALIB_FETCH_VERSION_TAG} from ${_url}")
116 file(DOWNLOAD "${_url}" "${_zip}"
118 TIMEOUT "${ALIB_FETCH_DOWNLOAD_TIMEOUT}"
121 list(GET _dl_status 0 _dl_code)
122 list(GET _dl_status 1 _dl_text)
123 if(NOT _dl_code EQUAL 0)
124 message(FATAL_ERROR "ALib download failed (${_dl_code}): ${_dl_text}")
127 if(ALIB_FETCH_SHA256)
128 file(SHA256 "${_zip}" _zip_sha)
129 if(NOT _zip_sha STREQUAL "${ALIB_FETCH_SHA256}")
130 message(FATAL_ERROR "ALib zip checksum mismatch. Expected ${ALIB_FETCH_SHA256} got ${_zip_sha}")
134 file(ARCHIVE_EXTRACT INPUT "${_zip}" DESTINATION "${ALIB_FETCH_FETCH_ROOT}")
136 if(NOT (EXISTS "${_alib_src_dir}/src/ALib.Lang.H" AND EXISTS "${_alib_src_dir}/src/alib"))
138 "Extracted ALib sources not found under ${ALIB_FETCH_FETCH_ROOT} "
139 "(expected path: ALib-Class-Library-${_alib_tag_without_v}).")
142 set(ALIB_BASE_DIR "${_alib_src_dir}" CACHE PATH "Path to ALib sources" FORCE)
143 if(ALIB_FETCH_OUT_BASE_DIR)
144 set(${ALIB_FETCH_OUT_BASE_DIR} "${ALIB_BASE_DIR}" PARENT_SCOPE)