Add WebAssembly build workflow for Ubuntu and update CMake warnings for OpenGL usage
Add workaround for platform-specific macros setup before project command
Update CMake configuration for Emscripten and Android toolchains;
Disable default features for vcpkg manifest
Update GitHub workflows to support multiple build types and improve compiler flag handling
Disabled DETools module for Emscripten support in CMake configuration
cxx: "x86_64-w64-mingw32-g++",
package: "mingw-w64-x86_64-toolchain",
thirdparty_dir: "/mingw64",
+ compiler_flags: "",
dependencies: "mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja mingw-w64-x86_64-rapidjson mingw-w64-x86_64-freetype mingw-w64-x86_64-draco mingw-w64-x86_64-freeimage mingw-w64-x86_64-tbb mingw-w64-x86_64-tk mingw-w64-x86_64-tcl mingw-w64-x86_64-openvr mingw-w64-x86_64-jemalloc mingw-w64-x86_64-mesa mingw-w64-x86_64-angleproject mingw-w64-x86_64-llvm-openmp mingw-w64-x86_64-winpthreads-git mingw-w64-x86_64-libwinpthread-git mingw-w64-cross-mingwarm64-winpthreads"
}
- {
cxx: "clang++",
package: "mingw-w64-clang-x86_64-toolchain",
thirdparty_dir: "/clang64",
+ compiler_flags: "-D CMAKE_CXX_FLAGS=\"-Wall -Wextra\" -D CMAKE_C_FLAGS=\"-Wall -Wextra\"",
dependencies: "mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-ninja mingw-w64-clang-x86_64-rapidjson mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-draco mingw-w64-clang-x86_64-freeimage mingw-w64-clang-x86_64-tbb mingw-w64-clang-x86_64-tk mingw-w64-clang-x86_64-tcl mingw-w64-clang-x86_64-openvr mingw-w64-clang-x86_64-jemalloc mingw-w64-clang-x86_64-mesa mingw-w64-clang-x86_64-angleproject mingw-w64-clang-x86_64-llvm-openmp mingw-w64-clang-x86_64-winpthreads-git mingw-w64-clang-x86_64-libwinpthread-git mingw-w64-cross-mingwarm64-winpthreads"
}
- {
cxx: "x86_64-w64-mingw32-g++",
package: "mingw-w64-ucrt-x86_64-toolchain",
thirdparty_dir: "/ucrt64",
+ compiler_flags: "",
dependencies: "mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gcc-libs mingw-w64-ucrt-x86_64-omp mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-rapidjson mingw-w64-ucrt-x86_64-freetype mingw-w64-ucrt-x86_64-draco mingw-w64-ucrt-x86_64-freeimage mingw-w64-ucrt-x86_64-tbb mingw-w64-ucrt-x86_64-tk mingw-w64-ucrt-x86_64-tcl mingw-w64-ucrt-x86_64-openvr mingw-w64-ucrt-x86_64-jemalloc mingw-w64-ucrt-x86_64-mesa mingw-w64-ucrt-x86_64-angleproject mingw-w64-ucrt-x86_64-llvm-openmp mingw-w64-ucrt-x86_64-winpthreads-git mingw-w64-ucrt-x86_64-libwinpthread-git mingw-w64-cross-mingwarm64-winpthreads"
}
+ build_type: [Debug, Release]
steps:
- name: Checkout repository
-D CMAKE_C_COMPILER=${{ matrix.config.cc }} \
-D CMAKE_CXX_COMPILER=${{ matrix.config.cxx }} \
-D CMAKE_PREFIX_PATH=$MSYSTEM_PREFIX \
- -D CMAKE_CXX_FLAGS="-Wall -Wextra" \
- -D CMAKE_C_FLAGS="-Wall -Wextra" ..
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
+ ${{ matrix.config.compiler_flags }} ..
- name: Build basic
shell: msys2 {0}
run: |
cd build
- cmake --build . -- -j 4
+ cmake --build . --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
shell: pwsh
-D BUILD_OPT_PROFILE=Production \
-D BUILD_LIBRARY_TYPE=Shared \
-D USE_TK=ON \
- -D CMAKE_BUILD_TYPE=Debug \
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-D USE_MMGR_TYPE=JEMALLOC \
- -D INSTALL_DIR="${{ github.workspace }}/install" \
+ -D INSTALL_DIR="${{ github.workspace }}/install-${{ matrix.build_type }}" \
-D USE_FREETYPE=ON \
-D USE_DRACO=ON \
-D USE_FFMPEG=OFF \
-D USE_TBB=OFF \
-D USE_RAPIDJSON=ON \
-D USE_OPENGL=ON \
- -D CMAKE_CXX_FLAGS="-Wall -Wextra" \
- -D CMAKE_C_FLAGS="-Wall -Wextra" ..
+ ${{ matrix.config.compiler_flags }} ..
- name: Build full shared
shell: msys2 {0}
run: |
cd build
- cmake --build . --target install --config Debug -- -j 4
+ cmake --build . --target install --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
shell: pwsh
run: |
Remove-Item -Recurse -Force build
- Remove-Item -Recurse -Force ${{ github.workspace }}/install
+ Remove-Item -Recurse -Force ${{ github.workspace }}/install-${{ matrix.build_type }}
- name: Configure full static
shell: msys2 {0}
-D CMAKE_PREFIX_PATH=$MSYSTEM_PREFIX \
-D BUILD_USE_PCH=OFF \
-D BUILD_INCLUDE_SYMLINK=ON \
- -D BUILD_OPT_PROFILE=Production \
+ -D BUILD_OPT_PROFILE=Default \
-D BUILD_LIBRARY_TYPE=Static \
-D USE_TK=ON \
- -D CMAKE_BUILD_TYPE=Debug \
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-D USE_MMGR_TYPE=JEMALLOC \
- -D INSTALL_DIR="${{ github.workspace }}/install" \
+ -D INSTALL_DIR="${{ github.workspace }}/install-${{ matrix.build_type }}" \
-D USE_FREETYPE=ON \
-D USE_DRACO=ON \
-D USE_FFMPEG=OFF \
-D USE_TBB=OFF \
-D USE_RAPIDJSON=ON \
-D USE_OPENGL=ON \
- -D CMAKE_CXX_FLAGS="-Wall -Wextra" \
- -D CMAKE_C_FLAGS="-Wall -Wextra" ..
+ ${{ matrix.config.compiler_flags }} ..
- name: Build full static
shell: msys2 {0}
run: |
cd build
- cmake --build . --target install --config Debug -- -j 4
+ cmake --build . --target install --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
shell: pwsh
run: |
Remove-Item -Recurse -Force build
- Remove-Item -Recurse -Force ${{ github.workspace }}/install
+ Remove-Item -Recurse -Force ${{ github.workspace }}/install-${{ matrix.build_type }}
- name: Configure full with DEBUG define
shell: msys2 {0}
-D BUILD_OPT_PROFILE=Production \
-D BUILD_LIBRARY_TYPE=Shared \
-D USE_TK=ON \
- -D CMAKE_BUILD_TYPE=Debug \
- -D INSTALL_DIR="${{ github.workspace }}/install" \
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
+ -D INSTALL_DIR="${{ github.workspace }}/install-${{ matrix.build_type }}" \
-D USE_FREETYPE=ON \
-D USE_DRACO=ON \
-D USE_FFMPEG=OFF \
-D USE_VTK=OFF \
-D USE_TBB=OFF \
-D USE_RAPIDJSON=ON \
- -D USE_OPENGL=ON ..
+ -D USE_OPENGL=ON \
+ ${{ matrix.config.compiler_flags }} ..
- name: Build full with DEBUG define
shell: msys2 {0}
run: |
cd build
- cmake --build . --target install --config Debug -- -j 4
+ cmake --build . --target install --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
shell: pwsh
run: |
Remove-Item -Recurse -Force build
- Remove-Item -Recurse -Force ${{ github.workspace }}/install
+ Remove-Item -Recurse -Force ${{ github.workspace }}/install-${{ matrix.build_type }}
-D CMAKE_CXX_COMPILER=${{ matrix.config.cxx }} `
-D BUILD_USE_PCH=OFF `
-D BUILD_INCLUDE_SYMLINK=ON `
- -D BUILD_OPT_PROFILE=Production `
+ -D BUILD_OPT_PROFILE=Default `
-D BUILD_LIBRARY_TYPE=Static `
-D CMAKE_BUILD_TYPE=Debug `
-D INSTALL_DIR=${{ github.workspace }}/install `
- {
name: "GCC",
cc: "gcc",
- cxx: "g++"
+ cxx: "g++",
+ compiler_flags: ""
}
- {
name: "Clang",
cc: "clang",
- cxx: "clang++"
+ cxx: "clang++",
+ compiler_flags: "-D CMAKE_CXX_FLAGS=\"-Werror -Wall -Wextra\" -D CMAKE_C_FLAGS=\"-Werror -Wall -Wextra\""
}
+ build_type: [Debug, Release]
steps:
- name: Checkout repository
cmake -G "Ninja" \
-D CMAKE_C_COMPILER=${{ matrix.config.cc }} \
-D CMAKE_CXX_COMPILER=${{ matrix.config.cxx }} \
- -D CMAKE_CXX_FLAGS="-Werror -Wall -Wextra" \
- -D CMAKE_C_FLAGS="-Werror -Wall -Wextra" ..
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
+ ${{ matrix.config.compiler_flags }} ..
- name: Build basic
run: |
cd build
- cmake --build . -- -j 4
+ cmake --build . --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
run: |
-D BUILD_OPT_PROFILE=Production \
-D BUILD_LIBRARY_TYPE=Shared \
-D USE_TK=ON \
- -D CMAKE_BUILD_TYPE=Debug \
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-D USE_MMGR_TYPE=JEMALLOC \
- -D INSTALL_DIR=${{ github.workspace }}/install \
+ -D INSTALL_DIR=${{ github.workspace }}/install-${{ matrix.build_type }} \
-D 3RDPARTY_RAPIDJSON_DIR=${{ github.workspace }}/rapidjson-858451e5b7d1c56cf8f6d58f88cf958351837e53 \
-D USE_FREETYPE=ON \
-D USE_DRACO=ON \
-D USE_TBB=ON \
-D USE_RAPIDJSON=ON \
-D USE_OPENGL=ON \
- -D CMAKE_CXX_FLAGS="-Werror -Wall -Wextra" \
- -D CMAKE_C_FLAGS="-Werror -Wall -Wextra" ..
+ ${{ matrix.config.compiler_flags }} ..
- name: Build full shared
run: |
cd build
- cmake --build . --target install --config Debug -- -j 4
+ cmake --build . --target install --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
run: |
rm -rf build
- rm -rf ${{ github.workspace }}/install
+ rm -rf ${{ github.workspace }}/install-${{ matrix.build_type }}
- name: Configure full static
run: |
-D CMAKE_CXX_COMPILER=${{ matrix.config.cxx }} \
-D BUILD_USE_PCH=OFF \
-D BUILD_INCLUDE_SYMLINK=ON \
- -D BUILD_OPT_PROFILE=Production \
+ -D BUILD_OPT_PROFILE=Default \
-D BUILD_LIBRARY_TYPE=Static \
-D USE_TK=ON \
- -D CMAKE_BUILD_TYPE=Debug \
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-D USE_MMGR_TYPE=JEMALLOC \
- -D INSTALL_DIR=${{ github.workspace }}/install \
+ -D INSTALL_DIR=${{ github.workspace }}/install-${{ matrix.build_type }} \
-D 3RDPARTY_RAPIDJSON_DIR=${{ github.workspace }}/rapidjson-858451e5b7d1c56cf8f6d58f88cf958351837e53 \
-D USE_FREETYPE=ON \
-D USE_DRACO=ON \
-D USE_TBB=ON \
-D USE_RAPIDJSON=ON \
-D USE_OPENGL=ON \
- -D CMAKE_CXX_FLAGS="-Werror -Wall -Wextra" \
- -D CMAKE_C_FLAGS="-Werror -Wall -Wextra" ..
+ ${{ matrix.config.compiler_flags }} ..
- name: Build full static
run: |
cd build
- cmake --build . --target install --config Debug -- -j 4
+ cmake --build . --target install --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
run: |
rm -rf build
- rm -rf ${{ github.workspace }}/install
+ rm -rf ${{ github.workspace }}/install-${{ matrix.build_type }}
- name: Configure full with DEBUG define
run: |
-D BUILD_OPT_PROFILE=Production \
-D BUILD_LIBRARY_TYPE=Shared \
-D USE_TK=ON \
- -D CMAKE_BUILD_TYPE=Debug \
- -D INSTALL_DIR=${{ github.workspace }}/install \
+ -D CMAKE_BUILD_TYPE=${{ matrix.build_type }} \
+ -D INSTALL_DIR=${{ github.workspace }}/install-${{ matrix.build_type }} \
-D 3RDPARTY_RAPIDJSON_DIR=${{ github.workspace }}/rapidjson-858451e5b7d1c56cf8f6d58f88cf958351837e53 \
-D USE_FREETYPE=ON \
-D USE_DRACO=ON \
- name: Build full with DEBUG define
run: |
cd build
- cmake --build . --target install --config Debug -- -j 4
+ cmake --build . --target install --config ${{ matrix.build_type }} -- -j 4
- name: Clear up after build
run: |
rm -rf build
- rm -rf ${{ github.workspace }}/install
+ rm -rf ${{ github.workspace }}/install-${{ matrix.build_type }}
--- /dev/null
+# This workflow validates the WebAssembly build on Ubuntu.
+# It is triggered on pushes to the master branch.
+# The workflow includes steps to install dependencies, configure, build, and clean up the project.
+
+name: WebAssembly build (Ubuntu)
+
+on:
+ push:
+ branches:
+ - 'master'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
+ cancel-in-progress: true
+
+env:
+ USERNAME: Open-Cascade-SAS
+ VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg
+ FEED_URL: https://nuget.pkg.github.com/Open-Cascade-SAS/index.json
+ VCPKG_BINARY_SOURCES: "clear;nuget,https://nuget.pkg.github.com/Open-Cascade-SAS/index.json,readwrite"
+ EMSDK_VERSION: 3.1.74
+
+jobs:
+ wasm-build:
+ name: WebAssembly Build
+ runs-on: ubuntu-24.04
+
+ strategy:
+ matrix:
+ build_type: [Debug, Release]
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4.1.7
+
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y build-essential ninja-build curl zip unzip tar nasm autoconf mono-complete
+ sudo apt-get install -y libxi-dev libgl1-mesa-dev libglu1-mesa-dev mesa-common-dev libxrandr-dev libxxf86vm-dev
+
+ - name: Setup vcpkg
+ run: |
+ git clone https://github.com/microsoft/vcpkg.git
+ ./vcpkg/bootstrap-vcpkg.sh
+
+ - name: Add NuGet sources
+ run: |
+ mono $(${VCPKG_EXE} fetch nuget | tail -n 1) \
+ sources add \
+ -Source "${FEED_URL}" \
+ -StorePasswordInClearText \
+ -Name GitHubPackages \
+ -UserName "${USERNAME}" \
+ -Password "${{ secrets.GITHUB_TOKEN }}"
+ mono $(${VCPKG_EXE} fetch nuget | tail -n 1) \
+ setapikey "${{ secrets.GITHUB_TOKEN }}" \
+ -Source "${FEED_URL}"
+
+ - name: Setup Emscripten
+ run: |
+ git clone https://github.com/emscripten-core/emsdk.git
+ cd emsdk
+ ./emsdk install ${EMSDK_VERSION}
+ ./emsdk activate ${EMSDK_VERSION}
+ echo "EMSDK=${{ github.workspace }}/emsdk" >> $GITHUB_ENV
+ echo "${{ github.workspace }}/emsdk" >> $GITHUB_PATH
+ echo "${{ github.workspace }}/emsdk/upstream/emscripten" >> $GITHUB_PATH
+
+ - name: Configure OCCT with vcpkg
+ run: |
+ source "${{ github.workspace }}/emsdk/emsdk_env.sh"
+ mkdir -p "build-${{ matrix.build_type }}"
+ cd "build-${{ matrix.build_type }}"
+ export VCPKG_ROOT="${{ github.workspace }}/vcpkg"
+ emcmake cmake -G "Ninja" \
+ -DCMAKE_TOOLCHAIN_FILE="${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" \
+ -DVCPKG_TARGET_TRIPLET=wasm32-emscripten \
+ -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE="$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" \
+ -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
+ -DBUILD_USE_VCPKG=ON \
+ -DUSE_MMGR_TYPE=NATIVE \
+ -DBUILD_LIBRARY_TYPE=Static \
+ -DBUILD_MODULE_Draw=OFF \
+ -DUSE_FREETYPE=OFF \
+ -DUSE_TK=OFF \
+ -DUSE_TCL=OFF \
+ -DUSE_DRACO=ON \
+ -DUSE_FFMPEG=OFF \
+ -DUSE_FREEIMAGE=OFF \
+ -DUSE_OPENVR=OFF \
+ -DUSE_VTK=OFF \
+ -DUSE_TBB=OFF \
+ -DUSE_RAPIDJSON=ON \
+ -DINSTALL_DIR="${{ github.workspace }}/install-wasm-${{ matrix.build_type }}" \
+ -DCMAKE_CXX_FLAGS="-s WASM=1 -s EXPORTED_RUNTIME_METHODS=['ccall','cwrap'] -s ALLOW_MEMORY_GROWTH=1" \
+ -DCMAKE_EXECUTABLE_SUFFIX=".js" ..
+
+ - name: Build
+ run: |
+ cd build-${{ matrix.build_type }}
+ cmake --build . --config ${{ matrix.build_type }} --target install -- -j4
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-24.04, ubuntu-22.04, ubuntu-20.04, windows-2022, windows-2019, macos-15, macos-14, macos-13]
+ os: [ubuntu-24.04, ubuntu-22.04, windows-2022, windows-2019, macos-15, macos-14, macos-13]
build_type: [Debug, Release]
steps:
endif()
set (VCPKG_MANIFEST_DIR "${CMAKE_SOURCE_DIR}/adm/vcpkg")
+
+ # Disable default features for vcpkg manifest
+ set (VCPKG_MANIFEST_NO_DEFAULT_FEATURES 1)
+
+ # detection for Emscripten toolchain
+ if(CMAKE_TOOLCHAIN_FILE MATCHES ".*mscripten\.cmake$" OR "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" MATCHES ".*mscripten\.cmake$")
+ set(EMSCRIPTEN 1)
+ endif()
+
+ # detection for Android toolchain
+ if(CMAKE_TOOLCHAIN_FILE MATCHES ".*ndroid\.toolchain\.cmake$" OR "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" MATCHES ".*ndroid\.toolchain\.cmake$")
+ set(ANDROID 1)
+ endif()
+
+ # detection for android common variables
+ if (NOT "${CMAKE_ANDROID_NDK}" STREQUAL "" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Android" OR NOT "${ANDROID_NDK}" STREQUAL "")
+ set (ANDROID 1)
+ endif()
+else()
+ # Setting up the system and compiler specific variables.
+ # Can't be done on early stages with VCPKG enabled.
+ # VCPKG installing dependencies as soon as call PROJECT,
+ # but for then moment need to define required list of dependencies.
+ PROJECT (OCCT)
endif()
set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/adm/cmake")
"Please use our contact form at https://occt3d.com/")
unset (BUILD_SHARED_LIBS)
unset (BUILD_SHARED_LIBRARY_NAME_POSTFIX)
+ if (BUILD_OPT_PROFILE STREQUAL "Production")
+ set (BUILD_OPT_PROFILE "Default" CACHE STRING "Select profile for compiler and linker." FORCE)
+ message(WARNING "Static libraries are not optimized for production builds. "
+ "Please use shared libraries for production builds.")
+ endif()
endif()
if (WIN32)
message (STATUS "Info. Draw module is turned off due to it is not supported on UWP")
set (BUILD_MODULE_Draw OFF CACHE BOOL "${BUILD_MODULE_Draw_DESCR}" FORCE)
endif()
+if (EMSCRIPTEN AND BUILD_MODULE_DETools)
+ message (STATUS "Info. DETools module is turned off due to it is not supported on Emscripten")
+ set (BUILD_MODULE_DETools OFF CACHE BOOL "${BUILD_MODULE_DETools_DESCR}" FORCE)
+endif()
# accumulate used toolkits (first level) in BUILD_TOOLKITS variable
list (APPEND BUILD_TOOLKITS ${BUILD_ADDITIONAL_TOOLKITS})
if (NOT IOS)
list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/egl")
list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/gles2")
- OCCT_ADD_VCPKG_FEATURE ("angle")
+ if (NOT EMSCRIPTEN)
+ OCCT_ADD_VCPKG_FEATURE ("angle")
+ endif()
endif()
else()
if (NOT CAN_USE_GLES2)
OCCT_CHECK_AND_UNSET ("INSTALL_QT")
endif()
-# the name of the project
-project (OCCT)
+# VCPKG require delayed processing of 3rdparty.
+# That is why we delay the creating project and setting up
+# the platform specific variables.
+if (BUILD_USE_VCPKG)
+ project (OCCT)
+endif()
# copying clang-format file to the root of the project
file(COPY ${CMAKE_SOURCE_DIR}/.clang-format DESTINATION ${CMAKE_SOURCE_DIR})