44# cmake -DFORCE_DOWNLOAD=on -P download.cmake
55# memo:
66# スクリプト中のコメントのないhash値は、
7- # Tera Term Project が独自に算出しました
7+ # TeraTerm Project が独自に算出したものです
88
99option (FORCE_DOWNLOAD "force download" OFF )
1010option (FORCE_EXTRACT "force extract" OFF )
@@ -13,33 +13,35 @@ option(FORCE_EXTRACT "force extract" OFF)
1313# ファイルをダウンロードして、展開する
1414#
1515# ファイルが展開されているかチェック
16- # EXT_DIR 展開されているフォルダ
17- # CHECK_FILE チェックファイル,このファイルの有無とhashをチェックする
18- # ${EXT_DIR}相対 ${EXT_DIR}/${CHECK_FILE}
19- # CHECK_HASH チェックファイルhash値(sha256)
16+ # EXT_DIR 展開されているフォルダ
17+ # CHECK_FILE アーカイブの中にあり、hashをチェックするファイル(チェックファイル)
18+ # このファイルの有無とhashをチェックする
19+ # ${EXT_DIR}相対 ${EXT_DIR}/${CHECK_FILE}
20+ # CHECK_FILE_HASH チェックファイルhash値(sha256)
2021# ダウンロード
21- # SRC_URL アーカイブファイルのURL
22- # ARC_HASH アーカイブファイルのhash値
23- # または、hashの入っているファイルのURL
24- # DOWN_DIR ダウンロードしたファイルの収納ディレクトリ
22+ # SRC_URL アーカイブファイルのURL
23+ # ARC_HASH アーカイブファイルのhash値
24+ # または、hashの入っているファイルのURL
25+ # DOWN_DIR ダウンロードしたファイルの収納ディレクトリ
2526# 展開
26- # DIR_IN_ARC アーカイブ内のフォルダ名
27- # RENAME_DIR 展開後 ${DIR_IN_ARC} をリネーム
28- # ${EXT_DIR}/${RENAME_DIR} ができる
29- function (download_extract SRC_URL ARC_HASH DOWN_DIR EXT_DIR DIR_IN_ARC RENAME_DIR CHECK_FILE CHECK_HASH )
27+ # DIR_IN_ARC アーカイブ内のフォルダ名
28+ # RENAME_DIR 展開後 ${DIR_IN_ARC} をリネーム
29+ # ${EXT_DIR}/${RENAME_DIR} ができる
30+ function (download_extract SRC_URL ARC_HASH DOWN_DIR EXT_DIR DIR_IN_ARC RENAME_DIR CHECK_FILE CHECK_FILE_HASH )
3031
3132 # ファイルが展開されているかチェック
3233 if ((NOT FORCE_EXTRACT) AND (NOT FORCE_DOWNLOAD))
3334 if (EXISTS ${EXT_DIR} /${CHECK_FILE} )
34- file (SHA256 ${EXT_DIR} /${CHECK_FILE} HASH )
35+ file (SHA256 ${EXT_DIR} /${CHECK_FILE} CHECK_FILE_HASH_ACTUAL )
3536
36- if (${HASH} STREQUAL ${CHECK_HASH} )
37+ # ファイルが展開されていて、チェックファイルのhashが一致したら終了
38+ if (${CHECK_FILE_HASH_ACTUAL} STREQUAL ${CHECK_FILE_HASH} )
3739 return ()
3840 endif ()
3941
4042 message ("${EXT_DIR} /${CHECK_FILE} " )
41- message ("ACTUAL_HASH= ${HASH } " )
42- message ("EXPECT_HASH= ${CHECK_HASH } " )
43+ message ("ACTUAL_HASH: ${CHECK_FILE_HASH_ACTUAL } " )
44+ message ("EXPECT_HASH: ${CHECK_FILE_HASH } " )
4345 else ()
4446 message ("not exist ${EXT_DIR} /${CHECK_FILE} " )
4547 endif ()
@@ -49,9 +51,9 @@ function(download_extract SRC_URL ARC_HASH DOWN_DIR EXT_DIR DIR_IN_ARC RENAME_DI
4951 # アーカイブファイル名(フォルダ含まない)
5052 string (REGEX REPLACE "(.*)/([^/]*)$" "\\ 2" SRC_ARC ${SRC_URL} )
5153
52- # ダウンロードファイルのHASH値
54+ # アーカイブファイルのhash値
5355 if ("${ARC_HASH} " MATCHES "http" )
54- # download hash
56+ # download the ` hash file`
5557 string (REGEX REPLACE "(.*)/([^/]*)$" "\\ 2" HASH_FNAME ${ARC_HASH} )
5658 if ((NOT EXISTS ${DOWN_DIR} /${HASH_FNAME} ) OR FORCE_DOWNLOAD)
5759 message ("download ${ARC_HASH} " )
@@ -61,40 +63,76 @@ function(download_extract SRC_URL ARC_HASH DOWN_DIR EXT_DIR DIR_IN_ARC RENAME_DI
6163 SHOW_PROGRESS
6264 )
6365 endif ()
64- file (STRINGS ${DOWN_DIR} /${HASH_FNAME} HASH )
65- string (REGEX REPLACE "^(.+) (.+)$" "\\ 1" HASH ${HASH } )
66+ file (STRINGS ${DOWN_DIR} /${HASH_FNAME} ARC_FILE_HASH )
67+ string (REGEX REPLACE "^(.+) (.+)$" "\\ 1" ARC_FILE_HASH ${ARC_FILE_HASH } )
6668 else ()
67- # HASH値そのまま
68- set (HASH ${ARC_HASH} )
69+ # 渡された値そのまま
70+ set (ARC_FILE_HASH ${ARC_HASH} )
6971 endif ()
7072
71- # HASHの文字長からHASHの種別を決める
72- string (LENGTH ${HASH } HASH_LEN)
73+ # ARC_FILE_HASHの文字長からhashの種別を決める
74+ string (LENGTH ${ARC_FILE_HASH } HASH_LEN)
7375 if (${HASH_LEN} EQUAL 64)
7476 set (ARC_HASH_TYPE "SHA256" )
7577 else ()
76- message (FATAL_ERROR "unknwon hash HASH=${HASH } HASH_LEN=${HASH_LEN} " )
78+ message (FATAL_ERROR "unknwon hash HASH=${ARC_FILE_HASH } HASH_LEN=${HASH_LEN} " )
7779 endif ()
7880
7981 message ("ARCHIVE=${DOWN_DIR} /${SRC_ARC} " )
80- message ("ARCHIVE HASH ${ARC_HASH_TYPE} =${HASH } " )
82+ message ("ARCHIVE HASH ${ARC_HASH_TYPE} =${ARC_FILE_HASH } " )
8183 if (FORCE_DOWNLOAD)
8284 # 常にダウンロードする
8385 unset (EXPECTED_HASH )
8486 else ()
8587 # 必要ならダウンロードする
86- set (EXPECTED_HASH EXPECTED_HASH "${ARC_HASH_TYPE} =${HASH } " )
88+ set (EXPECTED_HASH EXPECTED_HASH "${ARC_HASH_TYPE} =${ARC_FILE_HASH } " )
8789 endif ()
8890
8991 # アーカイブをダウンロード
9092 message ("download ${SRC_URL} " )
91- file (DOWNLOAD
92- ${SRC_URL}
93- ${DOWN_DIR} /${SRC_ARC}
94- ${EXPECTED_HASH}
95- SHOW_PROGRESS
96- STATUS st
97- )
93+ set (MAX_RETRIES 3)
94+ set (RETRY_WAIT 30)
95+ set (RETRY_COUNT 0)
96+ set (DOWNLOAD_SUCCESS FALSE )
97+ while (NOT DOWNLOAD_SUCCESS AND
98+ (RETRY_COUNT LESS MAX_RETRIES OR RETRY_COUNT EQUAL MAX_RETRIES))
99+ # リトライの前に待つ
100+ if (RETRY_COUNT GREATER 0 AND
101+ (RETRY_COUNT LESS MAX_RETRIES OR RETRY_COUNT EQUAL MAX_RETRIES))
102+ message ("Wait ${RETRY_WAIT} sec..." )
103+ execute_process (COMMAND ${CMAKE_COMMAND} -E sleep ${RETRY_WAIT} )
104+ message ("Retrying..." )
105+ endif ()
106+
107+ # ダウンロード
108+ file (DOWNLOAD
109+ ${SRC_URL}
110+ ${DOWN_DIR} /${SRC_ARC}
111+ # ${EXPECTED_HASH}
112+ SHOW_PROGRESS
113+ STATUS st
114+ )
115+
116+ # ダウンロードのステータスを判定
117+ list (GET st 0 status_code)
118+ if (status_code EQUAL 0)
119+ set (DOWNLOAD_SUCCESS TRUE )
120+ else ()
121+ message ("Download failed. ${st} " )
122+ if (RETRY_COUNT EQUAL MAX_RETRIES)
123+ message (FATAL_ERROR "Maximum number of retries reached." )
124+ endif ()
125+ math (EXPR RETRY_COUNT "${RETRY_COUNT} + 1" )
126+ endif ()
127+ endwhile ()
128+
129+ # アーカイブファイルのhashをチェックする
130+ file (${ARC_HASH_TYPE} ${DOWN_DIR} /${SRC_ARC} ARC_FILE_HASH_ACTUAL)
131+ if (NOT ${ARC_FILE_HASH} STREQUAL ${ARC_FILE_HASH_ACTUAL} )
132+ message ("ACTUAL_HASH: ${ARC_HASH_TYPE} =${ARC_FILE_HASH_ACTUAL} " )
133+ message ("EXPECT_HASH: ${ARC_HASH_TYPE} =${ARC_FILE_HASH} " )
134+ message (FATAL_ERROR "Hash mismatch." )
135+ endif ()
98136
99137 # アーカイブファイルを展開する
100138 message ("expand ${EXT_DIR} /${DIR_IN_ARC} " )
@@ -119,7 +157,7 @@ function(download_argon2)
119157 set (DIR_IN_ARC "phc-winner-argon2-20190702" )
120158 set (RENAME_DIR "argon2" )
121159 set (CHECK_FILE "argon2/CHANGELOG.md" )
122- set (CHECK_HASH "1b513eb6524f0a3ac5e182bf2713618ddd8f2616ebe6e090d647c49b3e7eb2ec" )
160+ set (CHECK_FILE_HASH "1b513eb6524f0a3ac5e182bf2713618ddd8f2616ebe6e090d647c49b3e7eb2ec" )
123161 set (SRC_URL "https://github.com/P-H-C/phc-winner-argon2/archive/refs/tags/20190702.tar.gz" )
124162 set (ARC_HASH "daf972a89577f8772602bf2eb38b6a3dd3d922bf5724d45e7f9589b5e830442c" )
125163 # ARC_HASH by TeraTerm Project
@@ -132,7 +170,7 @@ function(download_argon2)
132170 ${DIR_IN_ARC}
133171 ${RENAME_DIR}
134172 ${CHECK_FILE}
135- ${CHECK_HASH }
173+ ${CHECK_FILE_HASH }
136174 )
137175endfunction ()
138176
@@ -143,7 +181,7 @@ function(download_cjson)
143181 set (DIR_IN_ARC "cJSON-1.7.14" )
144182 set (RENAME_DIR "cJSON" )
145183 set (CHECK_FILE "cJSON/CHANGELOG.md" )
146- set (CHECK_HASH "4ff95e0060ea2dbc13720079399e77d404d89e514b569fcc8d741f3272c98e53" )
184+ set (CHECK_FILE_HASH "4ff95e0060ea2dbc13720079399e77d404d89e514b569fcc8d741f3272c98e53" )
147185 set (SRC_URL "https://github.com/DaveGamble/cJSON/archive/v1.7.14.zip" )
148186 set (ARC_HASH "d797b4440c91a19fa9c721d1f8bab21078624aa9555fc64c5c82e24aa2a08221" )
149187 # ARC_HASH by TeraTerm Project
@@ -156,7 +194,7 @@ function(download_cjson)
156194 ${DIR_IN_ARC}
157195 ${RENAME_DIR}
158196 ${CHECK_FILE}
159- ${CHECK_HASH }
197+ ${CHECK_FILE_HASH }
160198 )
161199endfunction ()
162200
@@ -166,7 +204,7 @@ function(download_libressl)
166204 set (DIR_IN_ARC "libressl-4.2.1" )
167205 set (RENAME_DIR "libressl" )
168206 set (CHECK_FILE "libressl/ChangeLog" )
169- set (CHECK_HASH "f99c885d5318dc6357b4bb3563c0fb7ea536ff1734c67a436aa2532ebb4b5bd7" )
207+ set (CHECK_FILE_HASH "f99c885d5318dc6357b4bb3563c0fb7ea536ff1734c67a436aa2532ebb4b5bd7" )
170208 set (SRC_URL "https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-4.2.1.tar.gz" )
171209 set (ARC_HASH "6d5c2f58583588ea791f4c8645004071d00dfa554a5bf788a006ca1eb5abd70b" )
172210 # ARC_HASH was picked from https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/SHA256
@@ -179,7 +217,7 @@ function(download_libressl)
179217 ${DIR_IN_ARC}
180218 ${RENAME_DIR}
181219 ${CHECK_FILE}
182- ${CHECK_HASH }
220+ ${CHECK_FILE_HASH }
183221 )
184222endfunction ()
185223
@@ -189,7 +227,7 @@ function(download_oniguruma)
189227 set (DIR_IN_ARC "onig-6.9.10" )
190228 set (RENAME_DIR "oniguruma" )
191229 set (CHECK_FILE "oniguruma/HISTORY" )
192- set (CHECK_HASH "bdf00b251fa9dfb2aea3e1c007a0994bd40203a56706402c7cebb976c41d0cae" )
230+ set (CHECK_FILE_HASH "bdf00b251fa9dfb2aea3e1c007a0994bd40203a56706402c7cebb976c41d0cae" )
193231 set (SRC_URL "https://github.com/kkos/oniguruma/releases/download/v6.9.10/onig-6.9.10.tar.gz" )
194232 set (ARC_HASH "https://github.com/kkos/oniguruma/releases/download/v6.9.10/onig-6.9.10.tar.gz.sha256" )
195233 set (DOWN_DIR "${CMAKE_CURRENT_LIST_DIR} /download/oniguruma" )
@@ -201,7 +239,7 @@ function(download_oniguruma)
201239 ${DIR_IN_ARC}
202240 ${RENAME_DIR}
203241 ${CHECK_FILE}
204- ${CHECK_HASH }
242+ ${CHECK_FILE_HASH }
205243 )
206244endfunction ()
207245
@@ -211,7 +249,7 @@ function(download_sfmt)
211249 set (DIR_IN_ARC "SFMT-src-1.5.1" )
212250 set (RENAME_DIR "SFMT" )
213251 set (CHECK_FILE "SFMT/CHANGE-LOG.txt" )
214- set (CHECK_HASH "ac65302c740579c7dccc99b2fcd735af3027957680f2ce227042755646abb1db" )
252+ set (CHECK_FILE_HASH "ac65302c740579c7dccc99b2fcd735af3027957680f2ce227042755646abb1db" )
215253 set (SRC_URL "https://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/SFMT-src-1.5.1.zip" )
216254 set (ARC_HASH "630d1dfa6b690c30472f75fa97ca90ba62f9c13c5add6c264fdac2c1d3a878f4" )
217255 # ARC_HASH by TeraTerm Project
@@ -224,7 +262,7 @@ function(download_sfmt)
224262 ${DIR_IN_ARC}
225263 ${RENAME_DIR}
226264 ${CHECK_FILE}
227- ${CHECK_HASH }
265+ ${CHECK_FILE_HASH }
228266 )
229267 set (SFMT_VERSION_H "${EXT_DIR} /${RENAME_DIR} /SFMT_version_for_teraterm.h" )
230268 if (NOT EXISTS ${SFMT_VERSION_H} )
@@ -245,7 +283,7 @@ function(download_zlib)
245283 set (DIR_IN_ARC "zlib-1.3.1" )
246284 set (RENAME_DIR "zlib" )
247285 set (CHECK_FILE "zlib/ChangeLog" )
248- set (CHECK_HASH "f3bc368fd1722570d25411fece6b0e026ab95a9e20ccf39c4395aa41a956a4f0" )
286+ set (CHECK_FILE_HASH "f3bc368fd1722570d25411fece6b0e026ab95a9e20ccf39c4395aa41a956a4f0" )
249287 set (SRC_URL "https://zlib.net/zlib-1.3.1.tar.xz" )
250288 set (ARC_HASH "38ef96b8dfe510d42707d9c781877914792541133e1870841463bfa73f883e32" )
251289 # ARC_HASH was picked from https://www.zlib.net
@@ -258,7 +296,7 @@ function(download_zlib)
258296 ${DIR_IN_ARC}
259297 ${RENAME_DIR}
260298 ${CHECK_FILE}
261- ${CHECK_HASH }
299+ ${CHECK_FILE_HASH }
262300 )
263301endfunction ()
264302
0 commit comments