mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
1f6e350b4c
#8527 dropped Optimise's hard toposort dependency in favour of stdlib graphlib as the fallback backend, so the pip install added here is now dead weight: nothing in ifcpatch imports toposort any more, and igraph was always an optional speed-up guarded by pytest.importorskip in test_Optimise.py, never a hard requirement. Verified against #8527's merged code (v0.8.0@382f5e0c21) with neither package installed: all 6 test_Optimise.py tests pass or skip cleanly (the two igraph-specific tests skip via importorskip instead of erroring), so the install step served no remaining purpose. This contribution was produced with the assistance of an AI coding tool.
283 lines
11 KiB
YAML
283 lines
11 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/qtviewer/**'
|
|
- '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
|
|
env:
|
|
# Colored output for cmake.
|
|
CLICOLOR_FORCE: "1"
|
|
CMAKE_COLOR_DIAGNOSTICS: "ON"
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
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} \
|
|
libhdf5-dev 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.1.0 --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 \
|
|
"-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 .
|
|
./arbitrary_open_profile_def && test -f arbitrary_open_profile_def.ifc
|
|
./composite_profile_def && test -f composite_profile_def.ifc
|
|
./csg_primitive && test -f csg_primitive.ifc
|
|
./ellipse_pies && test -f ellipse_pies.ifc
|
|
./faces && test -f faces.ifc
|
|
./ifc_curve_rebar && test -f ifc_curve_rebar.ifc
|
|
./profiles
|
|
test -f IfcUShapeProfileDef.ifc
|
|
test -f IfcTShapeProfileDef.ifc
|
|
test -f IfcZShapeProfileDef.ifc
|
|
test -f IfcEllipseProfileDef.ifc
|
|
test -f IfcIShapeProfileDef.ifc
|
|
test -f IfcLShapeProfileDef.ifc
|
|
test -f IfcCShapeProfileDef.ifc
|
|
test -f IfcCircleProfileDef.ifc
|
|
test -f IfcRectangleProfileDef.ifc
|
|
test -f IfcTrapeziumProfileDef.ifc
|
|
./IfcParseExamples "../IfcParseExamples_test.ifc"
|
|
./IfcOpenHouse && test -f IfcOpenHouse.ifc
|
|
./IfcAdvancedHouse && test -f IfcAdvancedHouse.ifc
|
|
./IfcAlignment && test -f IfcAlignment.ifc
|
|
./IfcSimplifiedAlignment && test -f IfcSimplifiedAlignment.ifc
|
|
./triangulated_faceset && test -f triangulated_faceset.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 xlsxwriter
|
|
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
|
|
pip install mcp
|
|
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
|