Build and verify the candidate-only FreeCAD naming bridge and OCCT worker path, including three-stage StringHasher restoration. Add Datum, ShapeBinder, attachment-mode, and PartDesign structure oracles plus offline SDK build plans and CI boundary checks.
58 lines
2.8 KiB
Bash
58 lines
2.8 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
ICU_ROOT="${ICU_WASM_CACHE_DIR:-${ROOT_DIR}/.cache/toolchains/icu}"
|
|
ICU_DOWNLOAD_DIR="${ICU_ROOT}/downloads"
|
|
ICU_SOURCE_DIR="${ICU_ROOT}/src"
|
|
ICU_INSTALL_DIR="${ICU_ROOT}/install-wasm"
|
|
EM_CACHE_DIR="${ROOT_DIR}/.cache/toolchains/emscripten-freecad-cache"
|
|
ARCHIVE="${ICU_DOWNLOAD_DIR}/icu4c-68_2-src.tgz"
|
|
DOWNLOAD_URL="${ICU_DOWNLOAD_URL:-https://mirrors.aliyun.com/blfs/conglomeration/icu/icu4c-68_2-src.tgz}"
|
|
EXPECTED_MD5="c21cbdfe31a1e325afe765a16f907d20"
|
|
EXPECTED_SHA256="c79193dee3907a2199b8296a93b52c5cb74332c26f3d167269487680d479d625"
|
|
PORT_URL="https://github.com/unicode-org/icu/releases/download/release-68-2/icu4c-68_2-src.zip"
|
|
|
|
if [[ "$(emcc --version | sed -n '1s/.* \([0-9][0-9.]*\) .*/\1/p')" != "3.1.69" ]]; then
|
|
echo "ICU wasm SDK must use Emscripten 3.1.69." >&2
|
|
exit 1
|
|
fi
|
|
mkdir -p "${ICU_DOWNLOAD_DIR}" "${ICU_SOURCE_DIR}" "${ICU_INSTALL_DIR}/include" "${ICU_INSTALL_DIR}/lib"
|
|
if [[ ! -f "${ARCHIVE}" ]]; then
|
|
curl --fail --location --retry 3 --connect-timeout 15 --output "${ARCHIVE}.part" "${DOWNLOAD_URL}"
|
|
mv "${ARCHIVE}.part" "${ARCHIVE}"
|
|
fi
|
|
if [[ "$(md5sum "${ARCHIVE}" | awk '{print $1}')" != "${EXPECTED_MD5}" ]]; then
|
|
echo "ICU 68.2 archive MD5 mismatch." >&2
|
|
exit 1
|
|
fi
|
|
if [[ "$(sha256sum "${ARCHIVE}" | awk '{print $1}')" != "${EXPECTED_SHA256}" ]]; then
|
|
echo "ICU 68.2 archive SHA-256 mismatch." >&2
|
|
exit 1
|
|
fi
|
|
if [[ ! -f "${ICU_SOURCE_DIR}/source/common/unicode/utypes.h" ]]; then
|
|
tar -xzf "${ARCHIVE}" -C "${ICU_SOURCE_DIR}" --strip-components=1
|
|
fi
|
|
|
|
mkdir -p "${EM_CACHE_DIR}/ports/icu/icu"
|
|
cp -a "${ICU_SOURCE_DIR}/." "${EM_CACHE_DIR}/ports/icu/icu/"
|
|
printf '%s\n' "${PORT_URL}" > "${EM_CACHE_DIR}/ports/icu/.emscripten_url"
|
|
EM_FROZEN_CACHE=0 EM_CACHE="${EM_CACHE_DIR}" em++ -xc++ /dev/null -pthread -sUSE_ICU=1 -o "${ICU_ROOT}/icu-port-smoke.js"
|
|
|
|
cp -a "${EM_CACHE_DIR}/sysroot/include/unicode" "${ICU_INSTALL_DIR}/include/"
|
|
cp -f "${EM_CACHE_DIR}/sysroot/lib/wasm32-emscripten/libicu_common-mt.a" "${ICU_INSTALL_DIR}/lib/libicuuc.a"
|
|
cp -f "${EM_CACHE_DIR}/sysroot/lib/wasm32-emscripten/libicu_i18n-mt.a" "${ICU_INSTALL_DIR}/lib/libicui18n.a"
|
|
cp -f "${EM_CACHE_DIR}/sysroot/lib/wasm32-emscripten/libicu_stubdata-mt.a" "${ICU_INSTALL_DIR}/lib/libicudata.a"
|
|
cp -f "${EM_CACHE_DIR}/sysroot/lib/wasm32-emscripten/libicu_io-mt.a" "${ICU_INSTALL_DIR}/lib/libicuio.a"
|
|
|
|
cd "${ROOT_DIR}"
|
|
node --input-type=module - "${ICU_INSTALL_DIR}" <<'NODE'
|
|
import { inspectWasmStaticArchive } from './scripts/freecad-naming-sdk-lib.mjs'
|
|
const install = process.argv[2]
|
|
const archives = {}
|
|
for (const name of ['icuuc', 'icui18n', 'icudata', 'icuio']) {
|
|
archives[name] = await inspectWasmStaticArchive(`${install}/lib/lib${name}.a`)
|
|
}
|
|
console.log(JSON.stringify({ status: 'icu-wasm-pass', version: '68.2', pthread: true, archives }, null, 2))
|
|
NODE
|