ALib C++ Framework
by
Library Version: 2605 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
ALibFetch.cmake
1# ALibFetch.cmake
2#
3# Helper to ensure ALib sources are available locally.
4# Usage:
5# include("${CMAKE_CURRENT_LIST_DIR}/cmake/ALibFetch.cmake")
6# ALibEnsureSourceAvailable(
7# VERSION_TAG V2605R0
8# # optional:
9# # FETCH_ROOT "/path/to/cache"
10# # DOWNLOAD_TIMEOUT 60
11# # SHA256 "<hex>"
12# # QUIET
13# # OUT_BASE_DIR ALIB_BASE_DIR_LOCAL
14# )
15# include("${ALIB_BASE_DIR}/build/cmake/ALib.cmake")
16
17# \file
18
19include_guard(GLOBAL)
20
21function(ALibEnsureSourceAvailable)
22 set(_opts QUIET)
23 set(_one_value VERSION_TAG FETCH_ROOT DOWNLOAD_TIMEOUT SHA256 OUT_BASE_DIR)
24 cmake_parse_arguments(ALIB_FETCH "${_opts}" "${_one_value}" "" ${ARGN})
25
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)
32 endif()
33 return()
34 endif()
35
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}")
40 endif()
41 endif()
42 if(NOT ALIB_FETCH_VERSION_TAG)
43 message(FATAL_ERROR "ALibEnsureSourceAvailable: missing VERSION_TAG (example: V2605R0).")
44 endif()
45
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}")
49 endif()
50 endif()
51 if(NOT ALIB_FETCH_FETCH_ROOT)
52 if(WIN32)
53 if(DEFINED ENV{LocalAppData} AND NOT "$ENV{LocalAppData}" STREQUAL "")
54 set(ALIB_FETCH_FETCH_ROOT "$ENV{LocalAppData}/ALib")
55 else()
56 set(ALIB_FETCH_FETCH_ROOT "$ENV{USERPROFILE}/.alib")
57 endif()
58 elseif(APPLE)
59 set(ALIB_FETCH_FETCH_ROOT "$ENV{HOME}/Library/ALib")
60 else()
61 set(ALIB_FETCH_FETCH_ROOT "$ENV{HOME}/.cache/ALib")
62 endif()
63 endif()
64
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}")
68 else()
69 set(ALIB_FETCH_DOWNLOAD_TIMEOUT 60)
70 endif()
71 endif()
72
73 if(NOT ALIB_FETCH_SHA256)
74 if(DEFINED ALIB_SHA256 AND NOT "${ALIB_SHA256}" STREQUAL "")
75 set(ALIB_FETCH_SHA256 "${ALIB_SHA256}")
76 endif()
77 endif()
78
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)
82 set(_alib_quiet ON)
83 endif()
84
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}")
88 endif()
89 set(_alib_tag_without_v "${_alib_tag_with_v}")
90 string(REGEX REPLACE "^V" "" _alib_tag_without_v "${_alib_tag_without_v}")
91
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}")
95
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)
100 endif()
101 return()
102 endif()
103
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")
107
108 set(_dl_args SHOW_PROGRESS)
109 if(_alib_quiet)
110 set(_dl_args)
111 endif()
112
113 if(NOT _alib_quiet)
114 message(STATUS "Downloading ALib ${ALIB_FETCH_VERSION_TAG} from ${_url}")
115 endif()
116 file(DOWNLOAD "${_url}" "${_zip}"
117 TLS_VERIFY ON
118 TIMEOUT "${ALIB_FETCH_DOWNLOAD_TIMEOUT}"
119 STATUS _dl_status
120 ${_dl_args})
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}")
125 endif()
126
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}")
131 endif()
132 endif()
133
134 file(ARCHIVE_EXTRACT INPUT "${_zip}" DESTINATION "${ALIB_FETCH_FETCH_ROOT}")
135
136 if(NOT (EXISTS "${_alib_src_dir}/src/ALib.Lang.H" AND EXISTS "${_alib_src_dir}/src/alib"))
137 message(FATAL_ERROR
138 "Extracted ALib sources not found under ${ALIB_FETCH_FETCH_ROOT} "
139 "(expected path: ALib-Class-Library-${_alib_tag_without_v}).")
140 endif()
141
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)
145 endif()
146endfunction()