| 1 |
# |
| 2 |
# ex: |
| 3 |
# cmake -P download.cmake |
| 4 |
# cmake -DFORCE_DOWNLOAD=on -P download.cmake |
| 5 |
# memo: |
| 6 |
# スクリプト中のコメントのないhash値は、 |
| 7 |
# Tera Term Project が独自に算出しました |
| 8 |
|
| 9 |
option(FORCE_DOWNLOAD "force download" OFF) |
| 10 |
option(FORCE_EXTRACT "force extract" OFF) |
| 11 |
|
| 12 |
# download_extract() |
| 13 |
# ファイルをダウンロードして、展開する |
| 14 |
# |
| 15 |
# ファイルが展開されているかチェック |
| 16 |
# EXT_DIR 展開されているフォルダ |
| 17 |
# CHECK_FILE チェックファイル,このファイルの有無とhashをチェックする |
| 18 |
# ${EXT_DIR}相対 ${EXT_DIR}/${CHECK_FILE} |
| 19 |
# CHECK_HASH チェックファイルhash値(sha256) |
| 20 |
# ダウンロード |
| 21 |
# SRC_URL アーカイブファイルのURL |
| 22 |
# ARC_HASH アーカイブファイルのhash値 |
| 23 |
# または、hashの入っているファイルのURL |
| 24 |
# DOWN_DIR ダウンロードしたファイルの収納ディレクトリ |
| 25 |
# 展開 |
| 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) |
| 30 |
|
| 31 |
# ファイルが展開されているかチェック |
| 32 |
if((NOT FORCE_EXTRACT) AND (NOT FORCE_DOWNLOAD)) |
| 33 |
if(EXISTS ${EXT_DIR}/${CHECK_FILE}) |
| 34 |
file(SHA256 ${EXT_DIR}/${CHECK_FILE} HASH) |
| 35 |
|
| 36 |
if(${HASH} STREQUAL ${CHECK_HASH}) |
| 37 |
return() |
| 38 |
endif() |
| 39 |
|
| 40 |
message("${EXT_DIR}/${CHECK_FILE}") |
| 41 |
message("ACTUAL_HASH=${HASH}") |
| 42 |
message("EXPECT_HASH=${CHECK_HASH}") |
| 43 |
else() |
| 44 |
message("not exist ${EXT_DIR}/${CHECK_FILE}") |
| 45 |
endif() |
| 46 |
endif() |
| 47 |
|
| 48 |
|
| 49 |
# アーカイブファイル名(フォルダ含まない) |
| 50 |
string(REGEX REPLACE "(.*)/([^/]*)$" "\\2" SRC_ARC ${SRC_URL}) |
| 51 |
|
| 52 |
# ダウンロードファイルのHASH値 |
| 53 |
if("${ARC_HASH}" MATCHES "http") |
| 54 |
# download hash |
| 55 |
string(REGEX REPLACE "(.*)/([^/]*)$" "\\2" HASH_FNAME ${ARC_HASH}) |
| 56 |
if((NOT EXISTS ${DOWN_DIR}/${HASH_FNAME}) OR FORCE_DOWNLOAD) |
| 57 |
message("download ${ARC_HASH}") |
| 58 |
file(DOWNLOAD |
| 59 |
${ARC_HASH} |
| 60 |
${DOWN_DIR}/${HASH_FNAME} |
| 61 |
SHOW_PROGRESS |
| 62 |
) |
| 63 |
endif() |
| 64 |
file(STRINGS ${DOWN_DIR}/${HASH_FNAME} HASH) |
| 65 |
string(REGEX REPLACE "^(.+) (.+)$" "\\1" HASH ${HASH}) |
| 66 |
else() |
| 67 |
# HASH値そのまま |
| 68 |
set(HASH ${ARC_HASH}) |
| 69 |
endif() |
| 70 |
|
| 71 |
# HASHの文字長からHASHの種別を決める |
| 72 |
string(LENGTH ${HASH} HASH_LEN) |
| 73 |
if(${HASH_LEN} EQUAL 64) |
| 74 |
set(ARC_HASH_TYPE "SHA256") |
| 75 |
else() |
| 76 |
message(FATAL_ERROR "unknwon hash HASH=${HASH} HASH_LEN=${HASH_LEN}") |
| 77 |
endif() |
| 78 |
|
| 79 |
message("ARCHIVE=${DOWN_DIR}/${SRC_ARC}") |
| 80 |
message("ARCHIVE HASH ${ARC_HASH_TYPE}=${HASH}") |
| 81 |
if(FORCE_DOWNLOAD) |
| 82 |
# 常にダウンロードする |
| 83 |
unset(EXPECTED_HASH) |
| 84 |
else() |
| 85 |
# 必要ならダウンロードする |
| 86 |
set(EXPECTED_HASH EXPECTED_HASH "${ARC_HASH_TYPE}=${HASH}") |
| 87 |
endif() |
| 88 |
|
| 89 |
# アーカイブをダウンロード |
| 90 |
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 |
) |
| 98 |
|
| 99 |
# アーカイブファイルを展開する |
| 100 |
message("expand ${EXT_DIR}/${DIR_IN_ARC}") |
| 101 |
file(MAKE_DIRECTORY ${EXT_DIR}) |
| 102 |
execute_process( |
| 103 |
COMMAND ${CMAKE_COMMAND} -E tar "xf" ${DOWN_DIR}/${SRC_ARC} |
| 104 |
WORKING_DIRECTORY ${EXT_DIR} |
| 105 |
) |
| 106 |
|
| 107 |
# renameする |
| 108 |
message("rename ${EXT_DIR}/${RENAME_DIR}") |
| 109 |
file(REMOVE_RECURSE ${EXT_DIR}/${RENAME_DIR}) |
| 110 |
file(RENAME ${EXT_DIR}/${DIR_IN_ARC} ${EXT_DIR}/${RENAME_DIR}) |
| 111 |
|
| 112 |
endfunction() |
| 113 |
|
| 114 |
|
| 115 |
# argon2 |
| 116 |
function(download_argon2) |
| 117 |
message("argon2") |
| 118 |
set(EXT_DIR "${CMAKE_CURRENT_LIST_DIR}") |
| 119 |
set(DIR_IN_ARC "phc-winner-argon2-20190702") |
| 120 |
set(RENAME_DIR "argon2") |
| 121 |
set(CHECK_FILE "argon2/CHANGELOG.md") |
| 122 |
set(CHECK_HASH "1b513eb6524f0a3ac5e182bf2713618ddd8f2616ebe6e090d647c49b3e7eb2ec") |
| 123 |
set(SRC_URL "https://github.com/P-H-C/phc-winner-argon2/archive/refs/tags/20190702.tar.gz") |
| 124 |
set(ARC_HASH "daf972a89577f8772602bf2eb38b6a3dd3d922bf5724d45e7f9589b5e830442c") |
| 125 |
# ARC_HASH by TeraTerm Project |
| 126 |
set(DOWN_DIR "${CMAKE_CURRENT_LIST_DIR}/download/argon2") |
| 127 |
download_extract( |
| 128 |
${SRC_URL} |
| 129 |
${ARC_HASH} |
| 130 |
${DOWN_DIR} |
| 131 |
${EXT_DIR} |
| 132 |
${DIR_IN_ARC} |
| 133 |
${RENAME_DIR} |
| 134 |
${CHECK_FILE} |
| 135 |
${CHECK_HASH} |
| 136 |
) |
| 137 |
endfunction() |
| 138 |
|
| 139 |
# cJSON |
| 140 |
function(download_cjson) |
| 141 |
message("cJSON") |
| 142 |
set(EXT_DIR "${CMAKE_CURRENT_LIST_DIR}") |
| 143 |
set(DIR_IN_ARC "cJSON-1.7.14") |
| 144 |
set(RENAME_DIR "cJSON") |
| 145 |
set(CHECK_FILE "cJSON/CHANGELOG.md") |
| 146 |
set(CHECK_HASH "4ff95e0060ea2dbc13720079399e77d404d89e514b569fcc8d741f3272c98e53") |
| 147 |
set(SRC_URL "https://github.com/DaveGamble/cJSON/archive/v1.7.14.zip") |
| 148 |
set(ARC_HASH "d797b4440c91a19fa9c721d1f8bab21078624aa9555fc64c5c82e24aa2a08221") |
| 149 |
# ARC_HASH by TeraTerm Project |
| 150 |
set(DOWN_DIR "${CMAKE_CURRENT_LIST_DIR}/download/cJSON") |
| 151 |
download_extract( |
| 152 |
${SRC_URL} |
| 153 |
${ARC_HASH} |
| 154 |
${DOWN_DIR} |
| 155 |
${EXT_DIR} |
| 156 |
${DIR_IN_ARC} |
| 157 |
${RENAME_DIR} |
| 158 |
${CHECK_FILE} |
| 159 |
${CHECK_HASH} |
| 160 |
) |
| 161 |
endfunction() |
| 162 |
|
| 163 |
# libressl |
| 164 |
function(download_libressl) |
| 165 |
message("libressl") |
| 166 |
set(DIR_IN_ARC "libressl-3.7.3") |
| 167 |
set(RENAME_DIR "libressl") |
| 168 |
set(CHECK_FILE "libressl/ChangeLog") |
| 169 |
set(CHECK_HASH "dfa46531350c6aa61130630cf3c9bcf8a399d48464911cd5435671c23f919012") |
| 170 |
set(SRC_URL "https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-3.7.3.tar.gz") |
| 171 |
set(ARC_HASH "7948c856a90c825bd7268b6f85674a8dcd254bae42e221781b24e3f8dc335db3") |
| 172 |
# ARC_HASH was picked from https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/SHA256 |
| 173 |
set(DOWN_DIR "${CMAKE_CURRENT_LIST_DIR}/download/libressl") |
| 174 |
download_extract( |
| 175 |
${SRC_URL} |
| 176 |
${ARC_HASH} |
| 177 |
${DOWN_DIR} |
| 178 |
${EXT_DIR} |
| 179 |
${DIR_IN_ARC} |
| 180 |
${RENAME_DIR} |
| 181 |
${CHECK_FILE} |
| 182 |
${CHECK_HASH} |
| 183 |
) |
| 184 |
endfunction() |
| 185 |
|
| 186 |
# oniguruma |
| 187 |
function(download_oniguruma) |
| 188 |
message("oniguruma") |
| 189 |
set(DIR_IN_ARC "onig-6.9.8") |
| 190 |
set(RENAME_DIR "oniguruma") |
| 191 |
set(CHECK_FILE "oniguruma/HISTORY") |
| 192 |
set(CHECK_HASH "9291f7a1beaa0410265663dc8c18d442b7b3c4fd62a6d6f58df7cacdc4be3c92") |
| 193 |
set(SRC_URL "https://github.com/kkos/oniguruma/releases/download/v6.9.8/onig-6.9.8.tar.gz") |
| 194 |
set(ARC_HASH "https://github.com/kkos/oniguruma/releases/download/v6.9.8/onig-6.9.8.tar.gz.sha256") |
| 195 |
set(DOWN_DIR "${CMAKE_CURRENT_LIST_DIR}/download/oniguruma") |
| 196 |
download_extract( |
| 197 |
${SRC_URL} |
| 198 |
${ARC_HASH} |
| 199 |
${DOWN_DIR} |
| 200 |
${EXT_DIR} |
| 201 |
${DIR_IN_ARC} |
| 202 |
${RENAME_DIR} |
| 203 |
${CHECK_FILE} |
| 204 |
${CHECK_HASH} |
| 205 |
) |
| 206 |
endfunction() |
| 207 |
|
| 208 |
# putty |
| 209 |
function(download_putty) |
| 210 |
message("putty") |
| 211 |
set(EXT_DIR "${CMAKE_CURRENT_LIST_DIR}") |
| 212 |
set(DIR_IN_ARC "putty-0.76") |
| 213 |
#set(DIR_IN_ARC "putty-0.78") |
| 214 |
set(RENAME_DIR "putty") |
| 215 |
set(CHECK_FILE "putty/version.h") |
| 216 |
set(CHECK_HASH "c6975607ae6fb8510d56fae403fdd83bbafa3efe32397e5956375db49d0fadda") |
| 217 |
#set(CHECK_HASH "6909c326781299a12368a32b11d62f5fbbe75e3e8ef881a3dec81adff2694320") |
| 218 |
set(SRC_URL "https://the.earth.li/~sgtatham/putty/0.76/putty-0.76.tar.gz") |
| 219 |
#set(SRC_URL "https://the.earth.li/~sgtatham/putty/0.78/putty-0.78.tar.gz") |
| 220 |
set(ARC_HASH "547cd97a8daa87ef71037fab0773bceb54a8abccb2f825a49ef8eba5e045713f") |
| 221 |
# ARC_HASH was picked from https://the.earth.li/~sgtatham/putty/0.76/sha256sums |
| 222 |
#set(ARC_HASH "274e01bcac6bd155dfd647b2f18f791b4b17ff313753aa919fcae2e32d34614f") |
| 223 |
# ARC_HASH was picked from https://the.earth.li/~sgtatham/putty/0.78/sha256sums |
| 224 |
set(DOWN_DIR "${CMAKE_CURRENT_LIST_DIR}/download/putty") |
| 225 |
download_extract( |
| 226 |
${SRC_URL} |
| 227 |
${ARC_HASH} |
| 228 |
${DOWN_DIR} |
| 229 |
${EXT_DIR} |
| 230 |
${DIR_IN_ARC} |
| 231 |
${RENAME_DIR} |
| 232 |
${CHECK_FILE} |
| 233 |
${CHECK_HASH} |
| 234 |
) |
| 235 |
endfunction() |
| 236 |
|
| 237 |
# SFMT |
| 238 |
function(download_sfmt) |
| 239 |
message("SFMT") |
| 240 |
set(DIR_IN_ARC "SFMT-src-1.5.1") |
| 241 |
set(RENAME_DIR "SFMT") |
| 242 |
set(CHECK_FILE "SFMT/CHANGE-LOG.txt") |
| 243 |
set(CHECK_HASH "ac65302c740579c7dccc99b2fcd735af3027957680f2ce227042755646abb1db") |
| 244 |
set(SRC_URL "http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/SFMT-src-1.5.1.zip") |
| 245 |
set(ARC_HASH "630d1dfa6b690c30472f75fa97ca90ba62f9c13c5add6c264fdac2c1d3a878f4") |
| 246 |
# ARC_HASH by TeraTerm Project |
| 247 |
set(DOWN_DIR "${CMAKE_CURRENT_LIST_DIR}/download/SFMT") |
| 248 |
download_extract( |
| 249 |
${SRC_URL} |
| 250 |
${ARC_HASH} |
| 251 |
${DOWN_DIR} |
| 252 |
${EXT_DIR} |
| 253 |
${DIR_IN_ARC} |
| 254 |
${RENAME_DIR} |
| 255 |
${CHECK_FILE} |
| 256 |
${CHECK_HASH} |
| 257 |
) |
| 258 |
set(SFMT_VERSION_H "${EXT_DIR}/${RENAME_DIR}/SFMT_version_for_teraterm.h") |
| 259 |
if(NOT EXISTS ${SFMT_VERSION_H}) |
| 260 |
file(WRITE ${SFMT_VERSION_H} |
| 261 |
"// created by download.cmake\n" |
| 262 |
"#pragma once\n" |
| 263 |
"#ifndef SFMT_VERSION_H\n" |
| 264 |
"#define SFMT_VERSION_H\n" |
| 265 |
"#define SFMT_VERSION \"1.5.1\"\n" |
| 266 |
"#endif\n" |
| 267 |
) |
| 268 |
endif() |
| 269 |
endfunction() |
| 270 |
|
| 271 |
# zlib |
| 272 |
function(download_zlib) |
| 273 |
message("zlib") |
| 274 |
set(DIR_IN_ARC "zlib-1.3") |
| 275 |
set(RENAME_DIR "zlib") |
| 276 |
set(CHECK_FILE "zlib/ChangeLog") |
| 277 |
set(CHECK_HASH "e6fed9987017f53a18bf9eef883789577fc78feb3591bfbe3d68c3dd93d92aeb") |
| 278 |
set(SRC_URL "https://zlib.net/zlib-1.3.tar.xz") |
| 279 |
set(ARC_HASH "8a9ba2898e1d0d774eca6ba5b4627a11e5588ba85c8851336eb38de4683050a7") |
| 280 |
# ARC_HASH was picked from https://www.zlib.net |
| 281 |
set(DOWN_DIR "${CMAKE_CURRENT_LIST_DIR}/download/zlib") |
| 282 |
download_extract( |
| 283 |
${SRC_URL} |
| 284 |
${ARC_HASH} |
| 285 |
${DOWN_DIR} |
| 286 |
${EXT_DIR} |
| 287 |
${DIR_IN_ARC} |
| 288 |
${RENAME_DIR} |
| 289 |
${CHECK_FILE} |
| 290 |
${CHECK_HASH} |
| 291 |
) |
| 292 |
endfunction() |
| 293 |
|
| 294 |
########## |
| 295 |
if(NOT DEFINED TARGET) |
| 296 |
set(TARGET "all") |
| 297 |
endif() |
| 298 |
if(NOT DEFINED EXT_DIR) |
| 299 |
set(EXT_DIR "${CMAKE_CURRENT_LIST_DIR}") |
| 300 |
endif() |
| 301 |
#message("TARGET=${TARGET}") |
| 302 |
#message("EXT_DIR=${EXT_DIR}") |
| 303 |
|
| 304 |
if ((${TARGET} STREQUAL "all") OR (${TARGET} STREQUAL "cjson")) |
| 305 |
download_cjson() |
| 306 |
endif() |
| 307 |
if ((${TARGET} STREQUAL "all") OR (${TARGET} STREQUAL "argon2")) |
| 308 |
download_argon2() |
| 309 |
endif() |
| 310 |
if ((${TARGET} STREQUAL "all") OR (${TARGET} STREQUAL "libressl")) |
| 311 |
download_libressl() |
| 312 |
endif() |
| 313 |
if ((${TARGET} STREQUAL "all") OR (${TARGET} STREQUAL "oniguruma")) |
| 314 |
download_oniguruma() |
| 315 |
endif() |
| 316 |
if (${TARGET} STREQUAL "putty") |
| 317 |
download_putty() |
| 318 |
endif() |
| 319 |
if ((${TARGET} STREQUAL "all") OR (${TARGET} STREQUAL "sfmt")) |
| 320 |
download_sfmt() |
| 321 |
endif() |
| 322 |
if ((${TARGET} STREQUAL "all") OR (${TARGET} STREQUAL "zlib")) |
| 323 |
download_zlib() |
| 324 |
endif() |