# SPDX-License-Identifier: LGPL-2.1-or-later

# Incremental implementation/gate builds do not need the expensive wasm-opt
# pass used by release artifacts. Keep the switch in CMake so the build profile
# is explicit and can be turned off for final performance/release validation.
option(FREECAD_WEB_FAST_LINK "Use -O0 for Web probe link optimization during incremental work" ON)
if(FREECAD_WEB_FAST_LINK)
    set(_freecad_web_link_optimization "-O0")
else()
    set(_freecad_web_link_optimization "-O2")
endif()

add_executable(FreeCADWebPartBoxProbe PartBoxProbe.cpp)
target_compile_features(FreeCADWebPartBoxProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPartBoxProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
target_include_directories(FreeCADWebPartBoxProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
)
set(_freecad_web_python_build "${FREECAD_WEB_PYTHON_BUILD_ROOT}")
set(_freecad_web_python_encodings "${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/encodings")
target_link_libraries(FreeCADWebPartBoxProbe PRIVATE
    Part
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
set(_freecad_web_local_bzip2 "${CMAKE_SOURCE_DIR}/../.emscripten-cache/sysroot/lib/wasm32-emscripten/libbz2.a")
if(EXISTS "${_freecad_web_local_bzip2}")
    target_link_libraries(FreeCADWebPartBoxProbe PRIVATE "${_freecad_web_local_bzip2}")
endif()
target_link_options(FreeCADWebPartBoxProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebPartBoxProbe"
  "-sALLOW_MEMORY_GROWTH=1"
  "-sPTHREAD_POOL_SIZE=4"
  "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-pthread"
    "-sUSE_PTHREADS=1"
    "-sPTHREAD_POOL_SIZE=4"
    "-pthread"
    "-sUSE_PTHREADS=1"
    # Do not keep idle Node worker handles alive for synchronous dispatcher
    # probes. Native code can still create a pthread on demand when needed.
    "-sPTHREAD_POOL_SIZE=0"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall','FS_readFile','FS_readdir']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/enum.py@/freecad-python/enum.py"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/types.py@/freecad-python/types.py"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/App/AppPartPy.cpp@/freecad-mod/Part/AppPartPy.cpp"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/PartEnums.py@/freecad-mod/Part/PartEnums.py"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/MakeBottle.py@/freecad-mod/Part/MakeBottle.py"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/parttests@/freecad-mod/Part/parttests"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/JoinFeatures.py@/freecad-mod/Part/JoinFeatures.py"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/BasicShapes@/freecad-mod/Part/BasicShapes"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/BOPTools@/freecad-mod/Part/BOPTools"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/CompoundTools@/freecad-mod/Part/CompoundTools"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Part/AttachmentEditor@/freecad-mod/Part/AttachmentEditor"
)
set_target_properties(FreeCADWebPartBoxProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

add_executable(FreeCADWebPartDesktopCommandProbe PartDesktopCommandProbe.cpp PartDesktopCommands.cpp)
target_compile_features(FreeCADWebPartDesktopCommandProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPartDesktopCommandProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread")
target_include_directories(FreeCADWebPartDesktopCommandProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
    "${OCC_INCLUDE_DIR}"
)
target_link_directories(FreeCADWebPartDesktopCommandProbe PRIVATE "${OCC_LIBRARY_DIR}")
target_link_libraries(FreeCADWebPartDesktopCommandProbe PRIVATE Qt5::Core ${OCC_LIBRARIES})
target_link_options(FreeCADWebPartDesktopCommandProbe PRIVATE
    "${_freecad_web_link_optimization}"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebPartDesktopCommandProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-pthread"
    "-sUSE_PTHREADS=1"
    "-sPTHREAD_POOL_SIZE=0"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sERROR_ON_UNDEFINED_SYMBOLS=1"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
)
set_target_properties(FreeCADWebPartDesktopCommandProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

add_executable(FreeCADWebPartGeometryFamilyProbe PartGeometryFamilyProbe.cpp)
target_compile_features(FreeCADWebPartGeometryFamilyProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPartGeometryFamilyProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebPartGeometryFamilyProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebPartGeometryFamilyProbe PRIVATE Part ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebPartGeometryFamilyProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebPartGeometryFamilyProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
set_target_properties(FreeCADWebPartGeometryFamilyProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

add_executable(FreeCADWebPartIoProbe PartIoProbe.cpp)
target_compile_features(FreeCADWebPartIoProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPartIoProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebPartIoProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebPartIoProbe PRIVATE Part ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebPartIoProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebPartIoProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
set_target_properties(FreeCADWebPartIoProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

add_executable(FreeCADWebModuleLoaderProbe ModuleLoaderProbe.cpp)
target_compile_features(FreeCADWebModuleLoaderProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebModuleLoaderProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebModuleLoaderProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
)
target_link_libraries(FreeCADWebModuleLoaderProbe PRIVATE
    Part
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
target_link_options(FreeCADWebModuleLoaderProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebModuleLoaderProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
)
set_target_properties(FreeCADWebModuleLoaderProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

if(FREECAD_WEB_ENABLE_SANDBOX)
    add_executable(FreeCADWebSandboxRuntimeProbe SandboxRuntimeProbe.cpp)
    target_compile_features(FreeCADWebSandboxRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebSandboxRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebSandboxRuntimeProbe PRIVATE
        "${CMAKE_BINARY_DIR}"
        "${CMAKE_BINARY_DIR}/src"
        "${CMAKE_SOURCE_DIR}/src"
    )
    target_link_libraries(FreeCADWebSandboxRuntimeProbe PRIVATE
        Sandbox
        Mesh
        Part
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a"
    )
    if(EXISTS "${_freecad_web_local_bzip2}")
        target_link_libraries(FreeCADWebSandboxRuntimeProbe PRIVATE "${_freecad_web_local_bzip2}")
    endif()
    target_link_options(FreeCADWebSandboxRuntimeProbe PRIVATE
        "-O2"
        "-g0"
        "--no-entry"
        "-sWASM=1"
        "-sMODULARIZE=1"
        "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebSandboxRuntimeProbe"
        "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node"
        "--bind"
        "-pthread"
        "-sUSE_PTHREADS=1"
        "-sPTHREAD_POOL_SIZE=4"
        "-sDISABLE_EXCEPTION_CATCHING=0"
        "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Sandbox/Init.py@/freecad-mod/Sandbox/Init.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Sandbox/exportDRAWEXE.py@/freecad-mod/Sandbox/exportDRAWEXE.py"
    )
    set_target_properties(FreeCADWebSandboxRuntimeProbe PROPERTIES
        SUFFIX ".js"
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
endif()

# Plot.py is a Python/Qt helper rather than a C++ module.  The Web probe embeds
# the official source and exercises its emscripten headless backend without
# enabling the desktop GUI or requiring PySide/QtAgg.
add_executable(FreeCADWebPlotRuntimeProbe PlotRuntimeProbe.cpp)
target_compile_features(FreeCADWebPlotRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPlotRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebPlotRuntimeProbe PRIVATE
    "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebPlotRuntimeProbe PRIVATE
    Part ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebPlotRuntimeProbe PRIVATE
    "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebPlotRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Plot/Plot.py@/freecad-mod/Plot/Plot.py")
set_target_properties(FreeCADWebPlotRuntimeProbe PROPERTIES
    SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

if(FREECAD_WEB_ENABLE_REVERSEENGINEERING)
    add_executable(FreeCADWebReverseEngineeringRuntimeProbe ReverseEngineeringRuntimeProbe.cpp)
    target_compile_features(FreeCADWebReverseEngineeringRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebReverseEngineeringRuntimeProbe PRIVATE
        "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=0")
    target_include_directories(FreeCADWebReverseEngineeringRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebReverseEngineeringRuntimeProbe PRIVATE ReverseEngineering Materials ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebReverseEngineeringRuntimeProbe PRIVATE
        "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebReverseEngineeringRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node"
        "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=0"
        "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0"
        "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebReverseEngineeringRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_ROBOT)
    add_executable(FreeCADWebRobotRuntimeProbe RobotRuntimeProbeFixed.cpp)
    target_sources(FreeCADWebRobotRuntimeProbe PRIVATE RobotInventoryApi.cpp)
    target_compile_features(FreeCADWebRobotRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebRobotRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebRobotRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebRobotRuntimeProbe PRIVATE Robot Part Materials ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebRobotRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebRobotRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=0" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebRobotRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_SHOW)
    add_executable(FreeCADWebShowRuntimeProbe ShowRuntimeProbe.cpp)
    target_compile_features(FreeCADWebShowRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebShowRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebShowRuntimeProbe PRIVATE
        "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebShowRuntimeProbe PRIVATE
        FreeCADApp
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebShowRuntimeProbe PRIVATE
        "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1"
        "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebShowRuntimeProbe"
        "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
        "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/weakref.py@/freecad-python/weakref.py"
        "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/_weakrefset.py@/freecad-python/_weakrefset.py"
        "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/_collections_abc.py@/freecad-python/_collections_abc.py"
        "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/types.py@/freecad-python/types.py"
        "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/copy.py@/freecad-python/copy.py"
        "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/copyreg.py@/freecad-python/copyreg.py"
        "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/abc.py@/freecad-python/abc.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Show@/freecad-mod/Show")
    set_target_properties(FreeCADWebShowRuntimeProbe PROPERTIES
        SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_SPREADSHEET)
    add_executable(FreeCADWebSpreadsheetRuntimeProbe SpreadsheetRuntimeProbe.cpp)
    target_compile_features(FreeCADWebSpreadsheetRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebSpreadsheetRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebSpreadsheetRuntimeProbe PRIVATE
        "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebSpreadsheetRuntimeProbe PRIVATE
        Spreadsheet
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebSpreadsheetRuntimeProbe PRIVATE
        "-pthread" "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1"
        "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebSpreadsheetRuntimeProbe"
        "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sEXPORTED_RUNTIME_METHODS=['ccall','FS']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebSpreadsheetRuntimeProbe PROPERTIES
        SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(BUILD_INSPECTION AND BUILD_JTREADER AND BUILD_MATERIAL AND BUILD_MEASURE AND FREECAD_WEB_ENABLE_SPREADSHEET)
    add_executable(FreeCADWebDataPropertyFamilyProbe DataPropertyFamilyProbe.cpp)
    target_compile_features(FreeCADWebDataPropertyFamilyProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebDataPropertyFamilyProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebDataPropertyFamilyProbe PRIVATE
        "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebDataPropertyFamilyProbe PRIVATE
        Inspection JtReader Materials Measure Spreadsheet Part Mesh Points ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebDataPropertyFamilyProbe PRIVATE
        "-pthread" "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1"
        "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebDataPropertyFamilyProbe"
        "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=67108864"
        "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebDataPropertyFamilyProbe PROPERTIES
        SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_START)
    add_executable(FreeCADWebStartRuntimeProbe StartRuntimeProbe.cpp)
    target_compile_features(FreeCADWebStartRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebStartRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebStartRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebStartRuntimeProbe PRIVATE Start ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebStartRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebStartRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebStartRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

    add_executable(FreeCADWebStartRecoveryProbe StartRecoveryProbe.cpp)
    target_compile_features(FreeCADWebStartRecoveryProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebStartRecoveryProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebStartRecoveryProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebStartRecoveryProbe PRIVATE Start ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebStartRecoveryProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebStartRecoveryProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebStartRecoveryProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

    add_executable(FreeCADWebStartInventoryProbe StartInventoryProbe.cpp)
    target_compile_features(FreeCADWebStartInventoryProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebStartInventoryProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebStartInventoryProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebStartInventoryProbe PRIVATE Start ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebStartInventoryProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebStartInventoryProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebStartInventoryProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_SURFACE)
    add_executable(FreeCADWebSurfaceRuntimeProbe SurfaceRuntimeProbe.cpp)
    target_sources(FreeCADWebSurfaceRuntimeProbe PRIVATE SurfaceRecoveryProbe.cpp SurfacePersistenceProbe.cpp SurfacePersistenceRecoveryProbe.cpp SurfaceInventoryProbe.cpp SurfacePythonProbe.cpp SurfacePythonRecoveryProbe.cpp SurfaceFamilyProbe.cpp)
    target_compile_features(FreeCADWebSurfaceRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebSurfaceRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=0")
    target_include_directories(FreeCADWebSurfaceRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebSurfaceRuntimeProbe PRIVATE Surface Part Materials ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebSurfaceRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebSurfaceRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=0" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebSurfaceRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

add_executable(FreeCADWebPartDesignRuntimeProbe PartDesignRuntimeProbe.cpp)
target_compile_features(FreeCADWebPartDesignRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPartDesignRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
target_include_directories(FreeCADWebPartDesignRuntimeProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
)
target_link_libraries(FreeCADWebPartDesignRuntimeProbe PRIVATE
    PartDesign
    Sketcher
    Part
    Materials
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
if(EXISTS "${_freecad_web_local_bzip2}")
    target_link_libraries(FreeCADWebPartDesignRuntimeProbe PRIVATE "${_freecad_web_local_bzip2}")
endif()
target_link_options(FreeCADWebPartDesignRuntimeProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebPartDesignRuntimeProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-pthread"
    "-sUSE_PTHREADS=1"
    "-sPTHREAD_POOL_SIZE=4"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall','FS_readFile']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/PartDesign/fcgear@/freecad-mod/PartDesign/fcgear"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/PartDesign/fcsprocket@/freecad-mod/PartDesign/fcsprocket"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/PartDesign/WizardShaft@/freecad-mod/PartDesign/WizardShaft"
)
set_target_properties(FreeCADWebPartDesignRuntimeProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

add_executable(FreeCADWebPointsRuntimeProbe PointsRuntimeProbe.cpp)
target_compile_features(FreeCADWebPointsRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPointsRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
target_include_directories(FreeCADWebPointsRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebPointsRuntimeProbe PRIVATE Points Part ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebPointsRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebPointsRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
set_target_properties(FreeCADWebPointsRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

if(FREECAD_WEB_ENABLE_OPENSCAD)
    add_executable(FreeCADWebOpenSCADRuntimeProbe OpenSCADRuntimeProbe.cpp)
    target_compile_features(FreeCADWebOpenSCADRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebOpenSCADRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebOpenSCADRuntimeProbe PRIVATE
        "${CMAKE_BINARY_DIR}"
        "${CMAKE_BINARY_DIR}/src"
        "${CMAKE_SOURCE_DIR}/src"
    )
    target_link_libraries(FreeCADWebOpenSCADRuntimeProbe PRIVATE
        Part
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a"
    )
target_link_options(FreeCADWebOpenSCADRuntimeProbe PRIVATE
  "-O2"
  "-g0"
  "--no-entry"
  "-sWASM=1"
  "-sUSE_PTHREADS=1"
  "-sPTHREAD_POOL_SIZE=4"
  "-sMODULARIZE=1"
        "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebOpenSCADRuntimeProbe"
        "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node"
        "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0"
        "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/Init.py@/freecad-mod/OpenSCAD/Init.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/OpenSCADUtils.py@/freecad-mod/OpenSCAD/OpenSCADUtils.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/OpenSCADCommands.py@/freecad-mod/OpenSCAD/OpenSCADCommands.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/OpenSCADFeatures.py@/freecad-mod/OpenSCAD/OpenSCADFeatures.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py@/freecad-mod/OpenSCAD/OpenSCAD2Dgeom.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/importCSG.py@/freecad-mod/OpenSCAD/importCSG.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/prototype.py@/freecad-mod/OpenSCAD/prototype.py"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/OpenSCAD/InitGui.py@/freecad-mod/OpenSCAD/InitGui.py"
    )
    set_target_properties(FreeCADWebOpenSCADRuntimeProbe PROPERTIES
        SUFFIX ".js"
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
endif()

add_executable(FreeCADWebImportRuntimeProbe ImportRuntimeProbe.cpp)
target_compile_features(FreeCADWebImportRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebImportRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebImportRuntimeProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
)
target_link_libraries(FreeCADWebImportRuntimeProbe PRIVATE
    Import
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
if(EXISTS "${_freecad_web_local_bzip2}")
    target_link_libraries(FreeCADWebImportRuntimeProbe PRIVATE "${_freecad_web_local_bzip2}")
endif()
target_link_options(FreeCADWebImportRuntimeProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebImportRuntimeProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-pthread"
    "-sUSE_PTHREADS=1"
    "-sPTHREAD_POOL_SIZE=4"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    "--embed-file=${CMAKE_SOURCE_DIR}/../web/public/samples/freecad-sample.step@/fixtures/freecad-sample.step"
)
set_target_properties(FreeCADWebImportRuntimeProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

if(BUILD_INSPECTION)
    add_executable(FreeCADWebInspectionRuntimeProbe InspectionRuntimeProbe.cpp)
    target_compile_features(FreeCADWebInspectionRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebInspectionRuntimeProbe PRIVATE
        "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4"
    )
    target_include_directories(FreeCADWebInspectionRuntimeProbe PRIVATE
        "${CMAKE_BINARY_DIR}"
        "${CMAKE_BINARY_DIR}/src"
        "${CMAKE_SOURCE_DIR}/src"
    )
    target_link_libraries(FreeCADWebInspectionRuntimeProbe PRIVATE
        Inspection
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a"
    )
    target_link_options(FreeCADWebInspectionRuntimeProbe PRIVATE
        "-O2"
        "-g0"
        "--no-entry"
        "-sWASM=1"
        "-sMODULARIZE=1"
        "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebInspectionRuntimeProbe"
        "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node"
        "-pthread"
        "-sUSE_PTHREADS=1"
        "-sPTHREAD_POOL_SIZE=0"
        "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0"
        "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    )
set_target_properties(FreeCADWebInspectionRuntimeProbe PROPERTIES
        SUFFIX ".js"
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
endif()

if(BUILD_MATERIAL)
    add_executable(FreeCADWebMaterialRuntimeProbe MaterialRuntimeProbe.cpp)
    target_compile_features(FreeCADWebMaterialRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebMaterialRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebMaterialRuntimeProbe PRIVATE
        "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebMaterialRuntimeProbe PRIVATE
        Materials
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
  target_link_options(FreeCADWebMaterialRuntimeProbe PRIVATE
    "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebMaterialRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0" "-sERROR_ON_UNDEFINED_SYMBOLS=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebMaterialRuntimeProbe PROPERTIES
        SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
    add_executable(FreeCADWebMaterialKernelProbe MaterialKernelProbe.cpp)
    target_compile_features(FreeCADWebMaterialKernelProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebMaterialKernelProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebMaterialKernelProbe PRIVATE
        "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebMaterialKernelProbe PRIVATE
        Materials
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    if(EXISTS "${_freecad_web_local_bzip2}")
        target_link_libraries(FreeCADWebMaterialKernelProbe PRIVATE "${_freecad_web_local_bzip2}")
    endif()
    target_link_options(FreeCADWebMaterialKernelProbe PRIVATE
        "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebMaterialKernelProbe" "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4"
        "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
        "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Material/MaterialEditor.py@/freecad-mod/Material/MaterialEditor.py")
    set_target_properties(FreeCADWebMaterialKernelProbe PROPERTIES
        SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
    add_executable(FreeCADWebMaterialPythonKernelProbe MaterialPythonKernelProbe.cpp)
    target_compile_features(FreeCADWebMaterialPythonKernelProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebMaterialPythonKernelProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebMaterialPythonKernelProbe PRIVATE
        "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebMaterialPythonKernelProbe PRIVATE
        Materials
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebMaterialPythonKernelProbe PRIVATE
        "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebMaterialPythonKernelProbe" "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebMaterialPythonKernelProbe PROPERTIES
        SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(BUILD_JTREADER)
    add_executable(FreeCADWebJtReaderRuntimeProbe JtReaderRuntimeProbe.cpp)
    target_compile_features(FreeCADWebJtReaderRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebJtReaderRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebJtReaderRuntimeProbe PRIVATE
        "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebJtReaderRuntimeProbe PRIVATE
        JtReader
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebJtReaderRuntimeProbe PRIVATE
        "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebJtReaderRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebJtReaderRuntimeProbe PROPERTIES
        SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(BUILD_MEASURE)
    add_executable(FreeCADWebMeasureRuntimeProbe MeasureRuntimeProbe.cpp)
    target_compile_features(FreeCADWebMeasureRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebMeasureRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread")
target_include_directories(FreeCADWebMeasureRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebMeasureRuntimeProbe PRIVATE Measure Materials ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebMeasureRuntimeProbe PRIVATE "-pthread" "-sPTHREAD_POOL_SIZE=1")
  set_property(TARGET FreeCADWebMeasureRuntimeProbe APPEND PROPERTY LINK_OPTIONS "-sPTHREAD_POOL_SIZE=1")
target_link_options(FreeCADWebMeasureRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebMeasureRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
set_target_properties(FreeCADWebMeasureRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
    add_executable(FreeCADWebMeasureKernelProbe MeasureKernelProbe.cpp)
    target_compile_features(FreeCADWebMeasureKernelProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebMeasureKernelProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebMeasureKernelProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebMeasureKernelProbe PRIVATE Measure Materials ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebMeasureKernelProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebMeasureKernelProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebMeasureKernelProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(BUILD_MESH)
    add_executable(FreeCADWebMeshRuntimeProbe MeshRuntimeProbe.cpp)
    target_compile_features(FreeCADWebMeshRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebMeshRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebMeshRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebMeshRuntimeProbe PRIVATE Mesh ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    if(EXISTS "${_freecad_web_local_bzip2}")
        target_link_libraries(FreeCADWebMeshRuntimeProbe PRIVATE "${_freecad_web_local_bzip2}")
    endif()
    target_link_options(FreeCADWebMeshRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebMeshRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebMeshRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

    add_executable(FreeCADWebMeshGeometryFamilyProbe MeshGeometryFamilyProbe.cpp)
    target_compile_features(FreeCADWebMeshGeometryFamilyProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebMeshGeometryFamilyProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebMeshGeometryFamilyProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebMeshGeometryFamilyProbe PRIVATE Mesh ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebMeshGeometryFamilyProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebMeshGeometryFamilyProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebMeshGeometryFamilyProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(BUILD_MESH_PART)
    add_executable(FreeCADWebMeshPartRuntimeProbe MeshPartRuntimeProbe.cpp)
    target_compile_features(FreeCADWebMeshPartRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebMeshPartRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread")
    target_include_directories(FreeCADWebMeshPartRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebMeshPartRuntimeProbe PRIVATE MeshPart Materials ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebMeshPartRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-pthread" "-sUSE_PTHREADS=1" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebMeshPartRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebMeshPartRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

add_executable(FreeCADWebAssemblyProbe AssemblyRuntimeProbe.cpp)
target_compile_features(FreeCADWebAssemblyProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebAssemblyProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebAssemblyProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src/3rdParty/FastSignals/libfastsignals/include"
    "${CMAKE_SOURCE_DIR}/src/3rdParty/PyCXX"
    "${CMAKE_SOURCE_DIR}/src/3rdParty/OndselSolver"
    ${QtCore_INCLUDE_DIRS}
    "${fmt_SOURCE_DIR}/include"
    ${XercesC_INCLUDE_DIR}
    ${XercesC_INCLUDE_DIRS}
    ${Boost_INCLUDE_DIRS}
    ${Python3_INCLUDE_DIRS}
    ${Python3_INCLUDE_DIR}
    ${OCC_INCLUDE_DIR}
)
target_link_libraries(FreeCADWebAssemblyProbe PRIVATE
    Assembly
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
target_link_options(FreeCADWebAssemblyProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebAssemblyProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
)
set_target_properties(FreeCADWebAssemblyProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

add_executable(FreeCADWebAssemblyKernelProbe AssemblyKernelProbe.cpp)
target_compile_features(FreeCADWebAssemblyKernelProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebAssemblyKernelProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebAssemblyKernelProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src/3rdParty/OndselSolver"
)
target_link_libraries(FreeCADWebAssemblyKernelProbe PRIVATE
    Assembly
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
target_link_options(FreeCADWebAssemblyKernelProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebAssemblyKernelProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
)
set_target_properties(FreeCADWebAssemblyKernelProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

if(BUILD_CAM)
    add_executable(FreeCADWebCAMProbe CAMRuntimeProbe.cpp)
    target_compile_features(FreeCADWebCAMProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebCAMProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebCAMProbe PRIVATE
        "${CMAKE_BINARY_DIR}"
        "${CMAKE_BINARY_DIR}/src"
        "${CMAKE_SOURCE_DIR}/src"
    )
    target_link_libraries(FreeCADWebCAMProbe PRIVATE
        Path
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a"
    )
    target_link_options(FreeCADWebCAMProbe PRIVATE
        "${_freecad_web_link_optimization}"
        "-g0"
        "--no-entry"
        "-sWASM=1"
        "-sMODULARIZE=1"
        "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebCAMProbe"
        "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node"
        "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0"
        "-sEXPORTED_RUNTIME_METHODS=['ccall','FS']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    )
    set_target_properties(FreeCADWebCAMProbe PROPERTIES
        SUFFIX ".js"
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
endif()

add_executable(FreeCADWebDocumentProbe DocumentProbe.cpp)
target_compile_features(FreeCADWebDocumentProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebDocumentProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebDocumentProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
)
target_link_libraries(FreeCADWebDocumentProbe PRIVATE
    Part
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
target_link_options(FreeCADWebDocumentProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebDocumentProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall','FS']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
)
set_target_properties(FreeCADWebDocumentProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

add_executable(FreeCADWebWorkbenchCommandProbe WorkbenchCommandProbe.cpp)
target_compile_features(FreeCADWebWorkbenchCommandProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebWorkbenchCommandProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebWorkbenchCommandProbe PRIVATE
    "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebWorkbenchCommandProbe PRIVATE
    FreeCADApp ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebWorkbenchCommandProbe PRIVATE
    "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1"
    "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebWorkbenchCommandProbe"
    "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
set_target_properties(FreeCADWebWorkbenchCommandProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

add_executable(FreeCADWebDocumentGraphFamilyProbe DocumentGraphFamilyProbe.cpp)
target_compile_features(FreeCADWebDocumentGraphFamilyProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebDocumentGraphFamilyProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebDocumentGraphFamilyProbe PRIVATE
    "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebDocumentGraphFamilyProbe PRIVATE
    FreeCADApp Part ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebDocumentGraphFamilyProbe PRIVATE
    "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1"
    "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebDocumentGraphFamilyProbe"
    "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=67108864"
    "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
set_target_properties(FreeCADWebDocumentGraphFamilyProbe PROPERTIES
    SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

if(BUILD_FEM)
    add_executable(FreeCADWebFemGenericFamilyProbe FemGenericFamilyProbe.cpp FemDesktopCommands.cpp)
    target_compile_features(FreeCADWebFemGenericFamilyProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebFemGenericFamilyProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebFemGenericFamilyProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebFemGenericFamilyProbe PRIVATE Fem ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebFemGenericFamilyProbe PRIVATE "${_freecad_web_link_optimization}" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebFemGenericFamilyProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=67108864" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sERROR_ON_UNDEFINED_SYMBOLS=1" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/CreateLabels.py@/freecad-mod/Fem/CreateLabels.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/femcommands@/freecad-mod/Fem/femcommands" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/femguiutils@/freecad-mod/Fem/femguiutils" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/femobjects@/freecad-mod/Fem/femobjects" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/femtools@/freecad-mod/Fem/femtools" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/femsolver@/freecad-mod/Fem/femsolver" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/femviewprovider@/freecad-mod/Fem/femviewprovider" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Fem/fempreferencepages@/freecad-mod/Fem/fempreferencepages")
    set_target_properties(FreeCADWebFemGenericFamilyProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

add_executable(FreeCADWebSketcherProbe SketcherProbe.cpp)
target_compile_features(FreeCADWebSketcherProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebSketcherProbe PRIVATE
    "-O2" "-g0" "-fexceptions"
    "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
target_include_directories(FreeCADWebSketcherProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
)
target_link_libraries(FreeCADWebSketcherProbe PRIVATE
    Sketcher
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
if(EXISTS "${_freecad_web_local_bzip2}")
    target_link_libraries(FreeCADWebSketcherProbe PRIVATE "${_freecad_web_local_bzip2}")
endif()
target_link_options(FreeCADWebSketcherProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebSketcherProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-pthread"
    "-sUSE_PTHREADS=1"
    "-sPTHREAD_POOL_SIZE=4"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall','FS']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Sketcher/Profiles.py@/freecad-mod/Sketcher/Profiles.py"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Sketcher/ProfileLib/Hexagon.py@/freecad-mod/Sketcher/ProfileLib/Hexagon.py"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Sketcher/ProfileLib/RegularPolygon.py@/freecad-mod/Sketcher/ProfileLib/RegularPolygon.py"
)
set_target_properties(FreeCADWebSketcherProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

add_executable(FreeCADWebPythonProbe PythonRuntimeProbe.cpp)
target_compile_features(FreeCADWebPythonProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebPythonProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebPythonProbe PRIVATE
    "${CMAKE_BINARY_DIR}"
    "${CMAKE_BINARY_DIR}/src"
    "${CMAKE_SOURCE_DIR}/src"
)
target_link_libraries(FreeCADWebPythonProbe PRIVATE
    Part
    Mesh
    Points
    MeshPart
    ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a"
)
target_link_options(FreeCADWebPythonProbe PRIVATE
    "-O2"
    "-g0"
    "--no-entry"
    "-sWASM=1"
    "-sMODULARIZE=1"
    "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebPythonProbe"
    "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=33554432"
    "-sENVIRONMENT=web,worker,node"
    "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
)
set_target_properties(FreeCADWebPythonProbe PROPERTIES
    SUFFIX ".js"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

# Headless Draft bridge: execute the official Draft Python source against the
# FreeCAD App/Part WASM runtime. Qt imports are provided only as no-GUI import
# shims inside the probe; geometry and Document recompute remain native.
add_executable(FreeCADWebDraftRuntimeProbe DraftRuntimeProbe.cpp)
target_compile_features(FreeCADWebDraftRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebDraftRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
if(EXISTS "${_freecad_web_local_bzip2}")
    target_link_libraries(FreeCADWebDraftRuntimeProbe PRIVATE "${_freecad_web_local_bzip2}")
endif()
if(FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
    target_compile_options(FreeCADWebDraftRuntimeProbe PRIVATE "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
endif()
target_include_directories(FreeCADWebDraftRuntimeProbe PRIVATE
    "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebDraftRuntimeProbe PRIVATE
    Part ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebDraftRuntimeProbe PRIVATE
    "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebDraftRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=201326592" "-sENVIRONMENT=web,worker,node"
    "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/types.py@/freecad-python/types.py"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/copy.py@/freecad-python/copy.py"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/copyreg.py@/freecad-python/copyreg.py"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/abc.py@/freecad-python/abc.py"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12@/freecad-python/stdlib"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Draft@/freecad-mod/Draft"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/3rdParty/lazy_loader@/freecad-mod/lazy_loader")
if(FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
    target_link_options(FreeCADWebDraftRuntimeProbe PRIVATE "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
endif()
set_target_properties(FreeCADWebDraftRuntimeProbe PROPERTIES
    SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

# BIM is a Python workbench without a GUI-free C++ App target. Embed its
# official source tree for native source inventory; execution remains bounded
# until Arch/IFC dependencies have a real WebAssembly closure.
add_executable(FreeCADWebBimRuntimeProbe BimRuntimeProbe.cpp)
# Staging is regenerated by tools/prepare_bim_probe_resources.py before builds.
target_compile_features(FreeCADWebBimRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebBimRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebBimRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebBimRuntimeProbe PRIVATE FreeCADApp ${Python3_LIBRARIES}
    Part Materials
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
if(EXISTS "${_freecad_web_local_bzip2}")
    target_link_libraries(FreeCADWebBimRuntimeProbe PRIVATE "${_freecad_web_local_bzip2}")
endif()
target_link_options(FreeCADWebBimRuntimeProbe PRIVATE
    "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebBimRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=268435456" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=0"
    "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--preload-file=${CMAKE_BINARY_DIR}/bim-probe-staging@/")
set_target_properties(FreeCADWebBimRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set_property(TARGET FreeCADWebBimRuntimeProbe APPEND PROPERTY LINK_DEPENDS
    "${CMAKE_BINARY_DIR}/bim-probe-staging/.resource-manifest.sha256")

add_executable(FreeCADWebHelpRuntimeProbe HelpRuntimeProbe.cpp)
target_compile_features(FreeCADWebHelpRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebHelpRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
target_include_directories(FreeCADWebHelpRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebHelpRuntimeProbe PRIVATE FreeCADApp ${Python3_LIBRARIES}
    "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
    "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
    "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebHelpRuntimeProbe PRIVATE
    "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1"
    "-sEXPORT_NAME=FreeCADWebHelpRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1"
    "-sINITIAL_MEMORY=67108864" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1"
    "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']"
    "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/re@/freecad-python/re"
    "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Help@/freecad-mod/Help")
set_target_properties(FreeCADWebHelpRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

if(FREECAD_WEB_ENABLE_WEB)
    add_executable(FreeCADWebWebRuntimeProbe WebRuntimeProbe.cpp)
    target_compile_features(FreeCADWebWebRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebWebRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebWebRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebWebRuntimeProbe PRIVATE Web ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebWebRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebWebRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebWebRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_TECHDRAW_NATIVE)
    add_executable(FreeCADWebTechDrawRuntimeProbe TechDrawRuntimeProbe.cpp)
    target_compile_features(FreeCADWebTechDrawRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebTechDrawRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
    target_include_directories(FreeCADWebTechDrawRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebTechDrawRuntimeProbe PRIVATE TechDraw PartDesign Sketcher Spreadsheet Measure Part ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    if(EXISTS "${_freecad_web_local_bzip2}")
        target_link_libraries(FreeCADWebTechDrawRuntimeProbe PRIVATE "${_freecad_web_local_bzip2}")
    endif()
    # The OCCT pthread prefix is compiled with atomics/bulk-memory metadata,
    # so the native TechDraw probe can use Emscripten shared memory directly.
    target_link_options(FreeCADWebTechDrawRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebTechDrawRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=67108864" "-sENVIRONMENT=web,worker,node" "--bind" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sERROR_ON_UNDEFINED_SYMBOLS=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall','FS']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TechDraw@/freecad-mod/TechDraw")
    set_target_properties(FreeCADWebTechDrawRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_TEST)
    add_executable(FreeCADWebTestRuntimeProbe TestRuntimeProbe.cpp)
    target_compile_features(FreeCADWebTestRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebTestRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebTestRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebTestRuntimeProbe PRIVATE Part ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
    target_link_options(FreeCADWebTestRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebTestRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/Test/Init.py@/freecad-mod/Test/Init.py")
    set_target_properties(FreeCADWebTestRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

if(FREECAD_WEB_ENABLE_TUX)
    add_executable(FreeCADWebTuxRuntimeProbe TuxRuntimeProbe.cpp)
    target_compile_features(FreeCADWebTuxRuntimeProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebTuxRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebTuxRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
    target_link_libraries(FreeCADWebTuxRuntimeProbe PRIVATE)
    target_link_options(FreeCADWebTuxRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebTuxRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings")
    set_target_properties(FreeCADWebTuxRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

add_executable(FreeCADWebTemplatePyModRuntimeProbe TemplatePyModRuntimeProbe.cpp)
target_compile_features(FreeCADWebTemplatePyModRuntimeProbe PRIVATE cxx_std_17)
target_compile_options(FreeCADWebTemplatePyModRuntimeProbe PRIVATE "-O2" "-g0" "-fexceptions" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4")
target_include_directories(FreeCADWebTemplatePyModRuntimeProbe PRIVATE "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(FreeCADWebTemplatePyModRuntimeProbe PRIVATE Part Materials ${Python3_LIBRARIES} "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a" "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a" "${_freecad_web_python_build}/Modules/expat/libexpat.a")
target_link_options(FreeCADWebTemplatePyModRuntimeProbe PRIVATE "-O2" "-g0" "--no-entry" "-sWASM=1" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=FreeCADWebTemplatePyModRuntimeProbe" "-sALLOW_MEMORY_GROWTH=1" "-sINITIAL_MEMORY=33554432" "-sENVIRONMENT=web,worker,node" "-pthread" "-sUSE_PTHREADS=1" "-sPTHREAD_POOL_SIZE=4" "-sUSE_BZIP2=1" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=['ccall']" "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings" "--embed-file=${FREECAD_WEB_PYTHON_ROOT}/lib/python3.12/ast.py@/freecad-python/ast.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/Init.py@/freecad-mod/TemplatePyMod/Init.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/DocumentObject.py@/freecad-mod/TemplatePyMod/DocumentObject.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/Automation.py@/freecad-mod/TemplatePyMod/Automation.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/Commands.py@/freecad-mod/TemplatePyMod/Commands.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/FeaturePython.py@/freecad-mod/TemplatePyMod/FeaturePython.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/InitGui.py@/freecad-mod/TemplatePyMod/InitGui.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/MengerSponge.py@/freecad-mod/TemplatePyMod/MengerSponge.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/Mesh2Shape.py@/freecad-mod/TemplatePyMod/Mesh2Shape.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/PythonQt.py@/freecad-mod/TemplatePyMod/PythonQt.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/SplineSurface.py@/freecad-mod/TemplatePyMod/SplineSurface.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/TaskPanel.py@/freecad-mod/TemplatePyMod/TaskPanel.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/Tests.py@/freecad-mod/TemplatePyMod/Tests.py" "--embed-file=${CMAKE_SOURCE_DIR}/src/Mod/TemplatePyMod/Texture.py@/freecad-mod/TemplatePyMod/Texture.py")
set_target_properties(FreeCADWebTemplatePyModRuntimeProbe PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

if(BUILD_CLOUD)
    add_executable(FreeCADWebCloudProbe CloudRuntimeProbe.cpp)
    target_compile_features(FreeCADWebCloudProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebCloudProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebCloudProbe PRIVATE
        "${CMAKE_BINARY_DIR}"
        "${CMAKE_BINARY_DIR}/src"
        "${CMAKE_SOURCE_DIR}/src"
    )
    target_link_libraries(FreeCADWebCloudProbe PRIVATE
        Cloud
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a"
    )
    target_link_options(FreeCADWebCloudProbe PRIVATE
        "-O2"
        "-g0"
        "--no-entry"
        "-sWASM=1"
        "-sMODULARIZE=1"
        "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebCloudProbe"
        "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node"
        "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0"
        "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    )
    set_target_properties(FreeCADWebCloudProbe PROPERTIES
        SUFFIX ".js"
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
    add_executable(FreeCADWebCloudKernelProbe CloudKernelProbe.cpp)
    target_compile_features(FreeCADWebCloudKernelProbe PRIVATE cxx_std_17)
    target_compile_options(FreeCADWebCloudKernelProbe PRIVATE "-O2" "-g0" "-fexceptions")
    target_include_directories(FreeCADWebCloudKernelProbe PRIVATE
        "${CMAKE_BINARY_DIR}"
        "${CMAKE_BINARY_DIR}/src"
        "${CMAKE_SOURCE_DIR}/src"
    )
    target_link_libraries(FreeCADWebCloudKernelProbe PRIVATE
        Cloud
        Part
        ${Python3_LIBRARIES}
        "${_freecad_web_python_build}/Modules/_decimal/libmpdec/libmpdec.a"
        "${_freecad_web_python_build}/Modules/_hacl/libHacl_Hash_SHA2.a"
        "${_freecad_web_python_build}/Modules/expat/libexpat.a"
    )
    target_link_options(FreeCADWebCloudKernelProbe PRIVATE
        "-O2"
        "-g0"
        "--no-entry"
        "-sWASM=1"
        "-sMODULARIZE=1"
        "-sEXPORT_ES6=1"
        "-sEXPORT_NAME=FreeCADWebCloudKernelProbe"
        "-sALLOW_MEMORY_GROWTH=1"
        "-sINITIAL_MEMORY=33554432"
        "-sENVIRONMENT=web,worker,node"
        "-sUSE_BZIP2=1"
        "-sDISABLE_EXCEPTION_CATCHING=0"
        "-sEXPORTED_RUNTIME_METHODS=['ccall']"
        "--embed-file=${_freecad_web_python_encodings}@/freecad-python/encodings"
    )
    set_target_properties(FreeCADWebCloudKernelProbe PROPERTIES
        SUFFIX ".js"
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
endif()

# Apply the same development link profile to every probe declared in this
# directory. This keeps later module batches from silently falling back to a
# full `-O2` wasm-opt pass while the fast-link switch is enabled.
if(FREECAD_WEB_FAST_LINK)
    get_property(_freecad_web_probe_targets DIRECTORY PROPERTY BUILDSYSTEM_TARGETS)
    foreach(_freecad_web_probe_target IN LISTS _freecad_web_probe_targets)
        get_target_property(_freecad_web_probe_link_options ${_freecad_web_probe_target} LINK_OPTIONS)
        if(_freecad_web_probe_link_options)
            list(TRANSFORM _freecad_web_probe_link_options REPLACE "^-O2$" "${_freecad_web_link_optimization}")
            set_property(TARGET ${_freecad_web_probe_target} PROPERTY LINK_OPTIONS "${_freecad_web_probe_link_options}")
        endif()
    endforeach()
endif()
