Skip to content

Commit 18d648a

Browse files
authored
Merge pull request #981 from TeraTermProject/fix/#971-download_retry
ライブラリのソースのダウンロードをリトライに対応 #971
2 parents 5be28c5 + 9eb1c66 commit 18d648a

File tree

1 file changed

+85
-47
lines changed

1 file changed

+85
-47
lines changed

libs/download.cmake

Lines changed: 85 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# cmake -DFORCE_DOWNLOAD=on -P download.cmake
55
# memo:
66
# スクリプト中のコメントのないhash値は、
7-
# Tera Term Project が独自に算出しました
7+
# TeraTerm Project が独自に算出したものです
88

99
option(FORCE_DOWNLOAD "force download" OFF)
1010
option(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
)
137175
endfunction()
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
)
161199
endfunction()
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
)
184222
endfunction()
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
)
206244
endfunction()
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
)
263301
endfunction()
264302

0 commit comments

Comments
 (0)