Files
Web_FreeCAD_Bitbybit/scripts/build-freecad-naming-sdk-candidate.sh
wangdequan f64b78865c
Some checks failed
real-verification / chrome (push) Has been cancelled
real-verification / freecad-oracle (push) Has been cancelled
real-verification / wasm (push) Has been cancelled
feat: complete production naming and reference lifecycle gates
2026-08-14 10:10:30 -04:00

86 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SDK_ROOT="${FREECAD_WASM_SDK_OUTPUT_DIR:-${ROOT_DIR}/.cache/toolchains/freecad-naming-sdk}"
BUILD_DIR="${ROOT_DIR}/.cache/toolchains/freecad-naming-sdk/build-wasm"
REPORT_PATH="${SDK_ROOT}/candidate-build-report.json"
JOBS="${JOBS:-$(nproc)}"
cd "${ROOT_DIR}"
node scripts/check-freecad-wasm-sdk-build-plan.mjs >/dev/null
if [[ "${FREECAD_WASM_REUSE_OVERLAY:-0}" != "1" ]]; then
bash scripts/prepare-freecad-occt8-overlay.sh
fi
if [[ "${FREECAD_WASM_REUSE_CONFIGURE:-0}" != "1" ]]; then
node scripts/configure-freecad-naming-sdk-candidate.mjs
fi
cmake --build "${BUILD_DIR}" --target Part --parallel "${JOBS}"
mkdir -p "${SDK_ROOT}/lib"
cp -f "${BUILD_DIR}/lib/libFreeCADBase.so" "${SDK_ROOT}/lib/libFreeCADBase.a"
cp -f "${BUILD_DIR}/lib/libFreeCADApp.so" "${SDK_ROOT}/lib/libFreeCADApp.a"
cp -f "${BUILD_DIR}/Mod/Part/Part.so" "${SDK_ROOT}/lib/libPart.a"
node --input-type=module - "${SDK_ROOT}" "${REPORT_PATH}" <<'NODE'
import { writeFile } from 'node:fs/promises'
import { execFile } from 'node:child_process'
import { promisify } from 'node:util'
import { relative, resolve } from 'node:path'
import { inspectWasmStaticArchive, sha256File } from './scripts/freecad-naming-sdk-lib.mjs'
const run = promisify(execFile)
const root = process.cwd()
const sdkRoot = resolve(process.argv[2])
const reportPath = resolve(process.argv[3])
const specs = [
{ name: 'FreeCADBase', file: 'libFreeCADBase.a', requiredMembers: [] },
{
name: 'FreeCADApp',
file: 'libFreeCADApp.a',
requiredMembers: ['ElementMap.cpp.o', 'MappedElement.cpp.o', 'MappedName.cpp.o', 'ElementNamingUtils.cpp.o', 'StringHasher.cpp.o'],
},
{ name: 'Part', file: 'libPart.a', requiredMembers: ['TopoShape.cpp.o', 'TopoShapeExpansion.cpp.o', 'TopoShapeMapper.cpp.o'] },
]
const archives = []
for (const spec of specs) {
const path = resolve(sdkRoot, 'lib', spec.file)
const inspected = await inspectWasmStaticArchive(path)
const members = (await run('emar', ['t', path], { maxBuffer: 16 * 1024 * 1024 })).stdout.trim().split('\n').filter(Boolean)
const missingMembers = spec.requiredMembers.filter((member) => !members.includes(member))
if (missingMembers.length > 0) throw new Error(`${spec.name} archive is missing required members: ${missingMembers.join(', ')}`)
archives.push({
name: spec.name,
path: relative(root, path),
sha256: await sha256File(path),
...inspected,
requiredMembers: spec.requiredMembers,
})
}
const report = {
schemaVersion: 1,
status: 'candidate-archives-built',
availability: 'candidate-archives-only',
target: 'wasm32-emscripten',
freecadVersion: '1.1.1',
sourceCommit: '0108fd4b4850cc46e625b60e53cea7a7bbe69f8d',
emscriptenVersion: '3.1.69',
archives,
productionPublication: false,
productionManifestGenerated: false,
boundary: {
freecadNamingBuildStatus: 'production-linked',
exTsn02: 'completed',
systemExact: false,
workerLinked: true,
availability: 'available',
callbacks: ['freecadNamingAbiVersion', 'freecadNamingCapabilitiesJson', 'freecadNamingEvidenceJson'],
},
}
await writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`)
console.log(JSON.stringify({ ...report, report: relative(root, reportPath) }, null, 2))
NODE
git -C "${ROOT_DIR}/.cache/freecad/FreeCAD" diff --quiet
git -C "${ROOT_DIR}/.cache/freecad/FreeCAD" diff --cached --quiet