Save FreeCAD WebAssembly development state
Some checks failed
FreeCAD master CI / Prepare (push) Has been cancelled
FreeCAD master CI / Pixi (push) Has been cancelled
FreeCAD master CI / Ubuntu (push) Has been cancelled
FreeCAD master CI / Windows (push) Has been cancelled
FreeCAD master CI / Lint (push) Has been cancelled
FreeCAD master CI / WrapUp (push) Has been cancelled
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled

This commit is contained in:
2026-09-07 18:58:02 +08:00
parent 2778e3f9c2
commit f2eaf096d8
113 changed files with 30708 additions and 119 deletions

View File

@@ -127,11 +127,11 @@ if (OCC_FOUND)
TKV3d
TKRWMesh
)
if(FREECAD_WEB)
# The Web kernel does not build OCCT's MeshVS presentation library.
# Part/CAM App targets do not reference MeshVS symbols; keeping this
# desktop-only visualisation dependency in the Web OCAF closure makes
# otherwise GUI-free probes fail at link time.
if(FREECAD_WEB AND (NOT FREECAD_WEB_ENABLE_FEM OR NOT EXISTS "${OCC_LIBRARY_DIR}/libTKMeshVS.a"))
# The Web kernel may omit OCCT's MeshVS presentation library even when
# FEM is enabled in another build tree. Part/CAM/Import App targets do
# not reference MeshVS symbols, so do not emit a dangling -lTKMeshVS
# into otherwise GUI-free probe link closures.
list(REMOVE_ITEM OCC_OCAF_LIBRARIES TKMeshVS)
endif()

View File

@@ -12,6 +12,8 @@ set(FREECAD_WEB_QT_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}/qt-install" CACHE PATH
"Qt Emscripten installation prefix")
set(FREECAD_WEB_PYTHON_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}/python-install" CACHE PATH
"CPython Emscripten installation prefix")
set(FREECAD_WEB_PYTHON_BUILD_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}/python-probe" CACHE PATH
"CPython Emscripten build tree containing extension archives")
set(FREECAD_WEB_ICU_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}/icu-install" CACHE PATH
"ICU 68.2 Emscripten installation prefix")
set(FREECAD_WEB_ZLIB_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}/zlib-install" CACHE PATH
@@ -26,6 +28,53 @@ set(FREECAD_WEB_CURL_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}/curl-install" CACHE PA
"CURL 8.8.0 Emscripten installation prefix")
set(FREECAD_WEB_HOST_PYTHON_EXECUTABLE "" CACHE FILEPATH
"Native Python used for configure-time generators in a Web build")
set(FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT "" CACHE PATH
"Optional root containing atomics-tagged pthread Web dependencies")
# The regular Web dependency bundle intentionally omits QtGui/QtWidgets. A
# native TechDraw build needs the separately staged Qt closure; select it when
# the caller has not supplied a usable native Qt root. Keep an explicit
# FREECAD_WEB_QT_ROOT override authoritative so ordinary Web builds retain the
# lightweight dependency set.
if(FREECAD_WEB_ENABLE_TECHDRAW_NATIVE AND
NOT EXISTS "${FREECAD_WEB_QT_ROOT}/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake" AND
EXISTS "${FREECAD_WEB_DEPENDENCY_ROOT}/qt-techdraw-install/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake")
set(FREECAD_WEB_QT_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}/qt-techdraw-install" CACHE PATH
"Qt Emscripten installation prefix" FORCE)
message(STATUS "TechDraw native: using staged QtGui closure at ${FREECAD_WEB_QT_ROOT}")
endif()
if(FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
if(NOT FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT AND
EXISTS "${FREECAD_WEB_DEPENDENCY_ROOT}/occt-pthread-install" AND
EXISTS "${FREECAD_WEB_DEPENDENCY_ROOT}/python-pthread-install" AND
EXISTS "${FREECAD_WEB_DEPENDENCY_ROOT}/yaml-pthread-install" AND
EXISTS "${FREECAD_WEB_DEPENDENCY_ROOT}/icu-pthread-install" AND
EXISTS "${FREECAD_WEB_DEPENDENCY_ROOT}/boost-pthread-install")
set(FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT "${FREECAD_WEB_DEPENDENCY_ROOT}" CACHE PATH
"Root containing atomics-tagged pthread Web dependencies" FORCE)
endif()
if(FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT AND
EXISTS "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/occt-pthread-install" AND
EXISTS "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/python-pthread-install" AND
EXISTS "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/yaml-pthread-install" AND
EXISTS "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/icu-pthread-install" AND
EXISTS "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/boost-pthread-install")
message(STATUS "TechDraw native: using atomics-tagged pthread dependency closure")
set(FREECAD_WEB_OCCT_ROOT "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/occt-pthread-install" CACHE PATH
"OpenCASCADE pthread Web installation prefix" FORCE)
set(FREECAD_WEB_PYTHON_ROOT "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/python-pthread-install" CACHE PATH
"CPython pthread Web installation prefix" FORCE)
set(FREECAD_WEB_PYTHON_BUILD_ROOT "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/python-pthread" CACHE PATH
"CPython pthread Web build tree" FORCE)
set(FREECAD_WEB_YAML_ROOT "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/yaml-pthread-install" CACHE PATH
"yaml-cpp pthread Web installation prefix" FORCE)
set(FREECAD_WEB_ICU_ROOT "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/icu-pthread-install" CACHE PATH
"ICU pthread Web installation prefix" FORCE)
set(FREECAD_WEB_BOOST_ROOT "${FREECAD_WEB_PTHREAD_DEPENDENCY_ROOT}/boost-pthread-install" CACHE PATH
"Boost pthread Web installation prefix" FORCE)
endif()
endif()
function(_freecad_web_require path description)
if(NOT EXISTS "${path}")
@@ -73,6 +122,17 @@ _freecad_web_require("${_freecad_web_qt_cmake_root}/Qt5/Qt5Config.cmake" "Qt5 CM
_freecad_web_require("${_freecad_web_qt_cmake_root}/Qt5Core/Qt5CoreConfig.cmake" "Qt5Core CMake package")
_freecad_web_require("${_freecad_web_qt_cmake_root}/Qt5Network/Qt5NetworkConfig.cmake" "Qt5Network CMake package")
_freecad_web_require("${_freecad_web_qt_cmake_root}/Qt5Xml/Qt5XmlConfig.cmake" "Qt5Xml CMake package")
if(FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
foreach(_freecad_web_qt_native_component Gui Widgets Concurrent)
_freecad_web_require("${_freecad_web_qt_cmake_root}/Qt5${_freecad_web_qt_native_component}/Qt5${_freecad_web_qt_native_component}Config.cmake"
"Qt5${_freecad_web_qt_native_component} CMake package")
endforeach()
foreach(_freecad_web_qt_support_component EventDispatcherSupport FontDatabaseSupport EglSupport PlatformCompositorSupport AccessibilitySupport DeviceDiscoverySupport ServiceSupport ThemeSupport)
set("Qt5${_freecad_web_qt_support_component}_DIR"
"${_freecad_web_qt_cmake_root}/Qt5${_freecad_web_qt_support_component}"
CACHE PATH "Web Qt5${_freecad_web_qt_support_component} package" FORCE)
endforeach()
endif()
_freecad_web_require("${_freecad_web_python_include}/Python.h" "CPython 3.12 Web headers")
_freecad_web_require("${_freecad_web_python_library}" "CPython 3.12 Web static library")
_freecad_web_require("${_freecad_web_icu_include}/unicode/utypes.h" "ICU Web headers")
@@ -118,11 +178,17 @@ set(Boost_USE_MULTITHREADED OFF CACHE BOOL "Use single-threaded Boost Web librar
set(Boost_INCLUDE_DIR "${_freecad_web_boost_include}" CACHE PATH "Boost Web headers" FORCE)
set(Boost_LIBRARY_DIR "${_freecad_web_boost_library_dir}" CACHE PATH "Boost Web libraries" FORCE)
set(Qt5_DIR "${_freecad_web_qt_cmake_root}/Qt5" CACHE PATH "Web Qt5 package" FORCE)
foreach(_freecad_web_qt_component Core Network Xml)
list(PREPEND CMAKE_PREFIX_PATH "${_freecad_web_qt_cmake_root}")
set(_freecad_web_qt_components Core Network Xml)
if(FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
list(APPEND _freecad_web_qt_components Gui Widgets Concurrent)
endif()
foreach(_freecad_web_qt_component IN LISTS _freecad_web_qt_components)
set("Qt5${_freecad_web_qt_component}_DIR"
"${_freecad_web_qt_cmake_root}/Qt5${_freecad_web_qt_component}"
CACHE PATH "Web Qt5${_freecad_web_qt_component} package" FORCE)
endforeach()
unset(_freecad_web_qt_components)
set(Python3_EXECUTABLE "${FREECAD_WEB_HOST_PYTHON_EXECUTABLE}" CACHE FILEPATH
"Native Python for Web configure-time generators" FORCE)

View File

@@ -1,10 +1,13 @@
# -------------------------------- Qt --------------------------------
set(FREECAD_QT_COMPONENTS Core Concurrent Network Xml)
if(FREECAD_WEB)
if(FREECAD_WEB AND NOT FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
# QtConcurrent is only used by GUI code in the current Web module graph.
set(FREECAD_QT_COMPONENTS Core Network Xml)
endif()
if(FREECAD_WEB AND FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
list(APPEND FREECAD_QT_COMPONENTS Gui Widgets)
endif()
if (FREECAD_QT_MAJOR_VERSION EQUAL 6)
set (Qt6Core_MOC_EXECUTABLE Qt6::moc)
endif()

View File

@@ -92,7 +92,15 @@ macro(SetupSalomeSMESH)
if(NOT FREECAD_USE_EXTERNAL_SMESH)
find_package(MEDFile REQUIRED)
# See https://www.hdfgroup.org/HDF5/release/cmakebuild.html
if (MSVC)
if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten" AND HDF5_WASM_INCLUDE_DIRS AND HDF5_WASM_LIBRARIES)
# The host pkg-config database must not participate in the
# browser closure. MEDFile and SMESH consume the same
# Emscripten-built HDF5 archives used by VTK.
set(HDF5_INCLUDE_DIRS ${HDF5_WASM_INCLUDE_DIRS})
set(HDF5_LIBRARIES ${HDF5_WASM_LIBRARIES})
include_directories(${HDF5_WASM_INCLUDE_DIRS})
link_libraries(${HDF5_WASM_LIBRARIES})
elseif (MSVC)
find_package(HDF5 COMPONENTS NO_MODULE REQUIRED static)
else()
find_package(PkgConfig)