name: ci on: push: paths: - 'src/ifcblender/**' - 'src/ifcconvert/**' - 'src/ifcgeom/**' - 'src/ifcgeom_schema_agnostic/**' - 'src/ifcgeomserver/**' - 'src/ifcjni/**' - 'src/ifcmax/**' - 'src/ifcopenshell-python/**' - '!src/ifcopenshell-python/docs/**' - 'src/ifcparse/**' - '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 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 ../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. cd ../ifcopenshell-python pip install mathutils make test-mathutils || ERROR=1 if [ $ERROR -ne 0 ]; then echo "One or more tests failed"; exit 1; fi