mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 17:58:20 +00:00
fa1b70883f
mcp 2.0.0 (unpinned in CI and in the ifcmcp[mcp] extra) renamed mcp.server.fastmcp.FastMCP to mcp.server.mcpserver.MCPServer, which ifcmcp does not support yet. server.py caught the resulting ModuleNotFoundError with a bare except Exception and silently reported it as FastMCP not installed, masking the real breakage until the ifcmcp test suite failed in CI. Pinned mcp to >=1.0,<2 in both ci.yml and ifcmcp's pyproject.toml mcp extra, confirmed the full ifcmcp test suite (70 tests) passes against mcp 1.29.0, and confirmed the genuinely-not-installed path still raises the expected ImportError. Also narrowed the except clause to ImportError only so an unrelated future bug in that import block surfaces instead of being swallowed as "not installed". Generated with the assistance of an AI coding tool.
271 lines
10 KiB
YAML
271 lines
10 KiB
YAML
name: ci
|
|
|
|
on:
|
|
push:
|
|
paths:
|
|
- 'src/ifcblender/**'
|
|
- 'src/ifcconvert/**'
|
|
- 'src/ifcgeom/**'
|
|
- 'src/ifcgeom_schema_agnostic/**'
|
|
- 'src/ifcgeomserver/**'
|
|
- 'src/ifcjni/**'
|
|
- 'src/ifcmax/**'
|
|
- 'src/ifc5d/**'
|
|
- 'src/ifcedit/**'
|
|
- 'src/ifcmcp/**'
|
|
- 'src/ifcopenshell-python/**'
|
|
- '!src/ifcopenshell-python/docs/**'
|
|
- 'src/ifcparse/**'
|
|
- 'src/ifcquery/**'
|
|
- 'src/ifcwrap/**'
|
|
- 'src/svgfill/**'
|
|
- 'src/serializers/**'
|
|
- 'conda/**'
|
|
- 'cmake/**'
|
|
- '.github/workflows/ci.yml'
|
|
pull_request:
|
|
|
|
jobs:
|
|
activate:
|
|
runs-on: ubuntu-22.04
|
|
if: |
|
|
github.repository == 'IfcOpenShell/IfcOpenShell' &&
|
|
!contains(github.event.head_commit.message, 'skip ci')
|
|
steps:
|
|
- run: echo ok go
|
|
|
|
compile-and-test:
|
|
runs-on: ubuntu-22.04
|
|
needs: activate
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
build_shared_libs: [ON, OFF]
|
|
env:
|
|
# Colored output for cmake.
|
|
CLICOLOR_FORCE: "1"
|
|
CMAKE_COLOR_DIAGNOSTICS: "ON"
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: 3.11
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
pip install xmlschema xsdata numpy lxml pytest isodate lark networkx tabulate python-dateutil shapely pyparsing psutil
|
|
pip install src/bcf --no-deps
|
|
pip install pytest-xdist==3.8.0
|
|
|
|
- name: Install C++ dependencies
|
|
run: |
|
|
sudo apt update
|
|
# `occt-misc` is only needed for 22.04, since it has cmake configs.
|
|
# In 24.04+, the needed files were moved `libocct-foundation-dev` and `occt-misc` can be removed.
|
|
# Other libs in `OCCT_CMAKE_DEPS` are needed only for cmake config to work properly, they're not used directly.
|
|
OCCT_CMAKE_DEPS="occt-misc libocct-draw-dev tcl-dev tk-dev libxi-dev"
|
|
|
|
sudo apt-get install --no-install-recommends \
|
|
git cmake gcc g++ \
|
|
libboost-date-time-dev \
|
|
libboost-filesystem-dev \
|
|
libboost-iostreams-dev \
|
|
libboost-program-options-dev \
|
|
libboost-regex-dev \
|
|
libboost-system-dev \
|
|
libboost-thread-dev \
|
|
libpcre3-dev libxml2-dev \
|
|
libtbb-dev nlohmann-json3-dev \
|
|
libocct-foundation-dev libocct-modeling-algorithms-dev libocct-modeling-data-dev libocct-ocaf-dev libocct-visualization-dev libocct-data-exchange-dev \
|
|
${OCCT_CMAKE_DEPS} \
|
|
libcgal-dev libeigen3-dev
|
|
|
|
- name: ccache
|
|
uses: hendrikmuhs/ccache-action@v1.2.23
|
|
with:
|
|
key: ubuntu-22.04-${{ runner.arch }}
|
|
|
|
# RTTI is only enabled by default in Debug builds of rocksdb.
|
|
# Distros are using Release builds, so we're compiling it ourselves with RTTI forced on.
|
|
# https://github.com/facebook/rocksdb/blob/a3aa44a7167b8336f9bc15c8aba063260268ff68/CMakeLists.txt#L433
|
|
- name: build rocksdb
|
|
run: |
|
|
git clone https://github.com/facebook/rocksdb --branch v9.11.2
|
|
cd rocksdb
|
|
mkdir build && cd build
|
|
# rocksdb is using ccache automatically.
|
|
cmake -DFAIL_ON_WARNINGS=Off \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
|
-DWITH_TESTS=OFF \
|
|
-DWITH_TOOLS=OFF \
|
|
-DWITH_GFLAGS=OFF \
|
|
-DWITH_BENCHMARK_TOOLS=OFF \
|
|
-DWITH_CORE_TOOLS=OFF \
|
|
-DROCKSDB_BUILD_SHARED=Off \
|
|
-DCMAKE_POSITION_INDEPENDENT_CODE=On \
|
|
-DUSE_RTTI=On \
|
|
..
|
|
sudo make -j$(nproc) install
|
|
|
|
# OpenCOLLADA is ancient, but we still have it in the main build.
|
|
# So adding it to CI to catch any breakages.
|
|
- name: build OpenCOLLADA
|
|
run: |
|
|
git clone https://github.com/KhronosGroup/OpenCOLLADA
|
|
cd OpenCOLLADA
|
|
git checkout v1.6.68
|
|
patch -p1 --batch --forward -i ../nix/patches/opencollada/pr622_and_disable_subdirs.patch
|
|
patch -p1 --batch --forward -i ../nix/patches/opencollada/allow_static_libraries_config_on_unix.patch
|
|
mkdir build && cd build
|
|
cmake .. \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_CXX_FLAGS_INIT="-fPIC"
|
|
sudo make -j$(nproc) install
|
|
|
|
# We need zstd and libxml2 just for cmake config files to test the examples build.
|
|
# zslibzstd-dev has cmake config only on Ubuntu 24.04+.
|
|
- name : Build zstd
|
|
run: |
|
|
git clone https://github.com/facebook/zstd --depth 1 --branch v1.5.7
|
|
cd zstd
|
|
# `build` already exists.
|
|
mkdir build_ && cd build_
|
|
cmake ../build/cmake -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
|
sudo cmake --build . --target install -j $(nproc)
|
|
|
|
# libxml2-dev doesn't have cmake configs even on Ubuntu 24.04+.
|
|
- name: Build libxml2
|
|
run: |
|
|
git clone https://gitlab.gnome.org/GNOME/libxml2.git --branch v2.13.8 --depth 1
|
|
cd libxml2
|
|
mkdir build && cd build
|
|
cmake .. \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
|
sudo cmake --build . --target install -j $(nproc)
|
|
|
|
# Ubuntu has `swig` package, but we build it to match the version we use in the main build.
|
|
# To avoid failing tests when checking stub generation.
|
|
- name: build swig
|
|
run: |
|
|
# Remove default swig to avoid conflicts.
|
|
sudo apt remove --purge swig swig4.0
|
|
sudo apt-get install -y libpcre2-dev bison
|
|
git clone https://github.com/swig/swig --branch v4.2.1 --depth 1
|
|
cd swig
|
|
mkdir build && cd build
|
|
cmake .. \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
|
sudo make -j$(nproc) install
|
|
|
|
- name: Build ifcopenshell
|
|
run: |
|
|
echo $Python3_ROOT_DIR
|
|
echo ${{ env.pythonLocation }}
|
|
|
|
mkdir build && cd build
|
|
cmake \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_PREFIX_PATH=/usr \
|
|
-DCMAKE_SYSTEM_PREFIX_PATH=/usr \
|
|
-DPYTHON_EXECUTABLE:FILEPATH=${{ env.pythonLocation }}/bin/python \
|
|
-DPYTHON_INCLUDE_DIR:PATH=${{ env.pythonLocation }}/include/python3.11 \
|
|
-DUSE_MMAP=On \
|
|
-DBUILD_SHARED_LIBS=${{ matrix.build_shared_libs }} \
|
|
"-DSCHEMA_VERSIONS=2x3;4;4x3_add2" \
|
|
-DGLTF_SUPPORT=On \
|
|
-DWITH_ROCKSDB=On \
|
|
-DBUILD_EXAMPLES=ON \
|
|
../cmake
|
|
sudo make -j $(nproc)
|
|
sudo make install
|
|
|
|
# - name: Run IfcConvert on Sample files
|
|
# run: |
|
|
# (find test/input src/bonsai/test/files -name '*.ifc' | while read i; do \
|
|
# echo $i | tee -a log; \
|
|
# timeout 1m "$(which IfcConvert)" -yv "$i" "$i.obj" --validate >> log 2>&1; \
|
|
# echo $i $? >> statuses; \
|
|
# done) || true
|
|
# echo Failed
|
|
# grep -v 0$ statuses
|
|
# grep -v 0$ statuses | wc -l
|
|
# echo Succeeded
|
|
# grep 0$ statuses
|
|
# grep 0$ statuses | wc -l
|
|
|
|
- name: Run IfcConvert on Sample file
|
|
run: |
|
|
IfcConvert test/input/acad2010_walls.ifc test/input/acad2010_walls.obj
|
|
|
|
- name: Build standalone examples to test cmake package
|
|
run: |
|
|
set -x
|
|
cd src/examples
|
|
mkdir build && cd build
|
|
cmake .. -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
|
cmake --build .
|
|
./IfcOpenHouse && test -f IfcOpenHouse.ifc
|
|
./IfcParseExamples IfcOpenHouse.ifc
|
|
./IfcAdvancedHouse && test -f IfcAdvancedHouse.ifc
|
|
./IfcAlignment && test -f FHWA_Bridge_Geometry_Alignment_Example.ifc
|
|
./IfcSimplifiedAlignment && test -f FHWA_Bridge_Geometry_Alignment_Example_Simplified.ifc
|
|
|
|
- name: Test ifcopenshell-python
|
|
run: |
|
|
cd test
|
|
python tests.py
|
|
cd ../src/ifcopenshell-python
|
|
mv ifcopenshell ifcopenshell-local # Force testing on installed module
|
|
pip install -e ../ifcpatch --no-deps # Needed for sql.py tests.
|
|
ERROR=0
|
|
make test-parallel || ERROR=1
|
|
cd ../bcf && make test || ERROR=1
|
|
pip install requests
|
|
cd ../bsdd && make test || ERROR=1
|
|
pip install deepdiff
|
|
cd ../ifcdiff && make test || ERROR=1
|
|
cd ../ifcpatch && make test || ERROR=1
|
|
pip install -e ../ifc5d --no-deps
|
|
pip install odfpy openpyxl
|
|
cd ../ifc5d && make test || ERROR=1
|
|
pip install -e ../ifcquery --no-deps
|
|
cd ../ifcquery && make test || ERROR=1
|
|
pip install -e ../ifcedit --no-deps
|
|
cd ../ifcedit && make test || ERROR=1
|
|
# Pinned <2: mcp 2.0.0 renamed mcp.server.fastmcp.FastMCP to
|
|
# mcp.server.mcpserver.MCPServer, which ifcmcp doesn't support yet.
|
|
pip install "mcp>=1.0,<2"
|
|
pip install -e ../ifcmcp --no-deps
|
|
cd ../ifcmcp && make test || ERROR=1
|
|
pip install -e ../ifctester --no-deps
|
|
cd ../ifctester && make test || ERROR=1
|
|
make build-ids-docs || ERROR=1
|
|
# Run mathutils related tests at the end to ensure no other code is relying on mathutils.
|
|
# mathutils only has pre-built wheels for Python 3.13+; skip on older versions.
|
|
cd ../ifcopenshell-python
|
|
if python -c "import sys; sys.exit(0 if sys.version_info >= (3, 13) else 1)"; then
|
|
pip install mathutils
|
|
make test-mathutils || ERROR=1
|
|
fi
|
|
if [ $ERROR -ne 0 ]; then
|
|
echo "One or more tests failed";
|
|
exit 1;
|
|
fi
|