From dcad4146b6d607db58aef483f24e7f88f64325fb Mon Sep 17 00:00:00 2001 From: Kristoffer Andersen Date: Mon, 15 Aug 2022 16:40:42 +0200 Subject: [PATCH] PR daily builds of ifcopenshell and upload to conda (#2132) * WIP PR for daily builds of ifcopenshell * fix indentation in yaml * fix branch name * test daily builds using minimum occt ==v7.5.3 * chore: WIP daily builds - add tests * add test script bat/sh. Continue work in PR * fix: add more packages to test requires * fix: remove space in minimum version requirement of numpy * use manually installed MacOSX SDK on github runner. Minor rewrite of dynamic/static zlib conditional for conda_build. * fix MacOSX SDK address and made it platform conditional * make tests pass * try to skip ids tests for common icopenshell builds (caused failure on windows tests probably due to special character in filepath) * add conditional upload and testing of all available platform versions on github actions * fix wrong path to source files * fix errors in tests * remove test files and skip tests * only do import of ifcopenshell as means of testing and rely on the successful completion of ci.yml as a triggering mechanism instead * make conditional switch between original implementation of zlib suffix and new depending on conda packaging or not * point to occt v0.7.6 * make conditional import of BRepAdaptor_HCompCurve * try removing libxml2 include path * minor changes * Test nix builds * Test nix builds using only a single python version (in order to limit cpu/memory usage) * remove run check * remove testing of nix builds * Revert "Test nix builds using only a single python version (in order to limit cpu/memory usage)" This reverts commit 22a552a9acf37f673dc75846d51e20ff5340d1a9. * Revert "ci-py-only test modification" This reverts part of commit af1e832f * update occt version to 7.6.2 in daily builds * Revert "Test nix builds" This reverts commit af1e832f81980ed4b12f7f2f48f7de49375d18dd. * Complete setups for local and cloud environments. And start by adding IfcPerson as a test case for the REST api communication * Revert changing checkout version of MVD --- .github/workflows/ci-daily-build.yml | 63 +++++++++++++++++++ cmake/CMakeLists.txt | 68 ++++++++++++++------ conda/Makefile | 11 ++++ conda/bld.bat | 55 +++++++++------- conda/build.sh | 58 ++++++++++------- conda/conda_build_config.yaml | 2 + conda/cross-linux.cmake | 16 +++++ conda/environment.yml | 14 +++++ conda/meta.yaml | 93 +++++++++++++++++++--------- src/ifcgeom/IfcTrimmedCurve.cpp | 4 ++ 10 files changed, 291 insertions(+), 93 deletions(-) create mode 100644 .github/workflows/ci-daily-build.yml create mode 100644 conda/Makefile create mode 100644 conda/conda_build_config.yaml create mode 100644 conda/cross-linux.cmake create mode 100644 conda/environment.yml diff --git a/.github/workflows/ci-daily-build.yml b/.github/workflows/ci-daily-build.yml new file mode 100644 index 0000000000..644ac3f8fa --- /dev/null +++ b/.github/workflows/ci-daily-build.yml @@ -0,0 +1,63 @@ +name: ci-ifcopenshell-daily + +on: + push: + paths: + - src/** + - conda/** + - .github/workflows/ci-daily-build.yml + branches: + - pr-daily-builds +# Only trigger, when the build workflow succeeded + workflow_run: + workflows: ["ci"] + types: + - completed + +jobs: + test: + name: ${{ matrix.platform.distver }}-${{ matrix.pyver.name }} + runs-on: ${{ matrix.platform.distver }} + defaults: + run: + shell: bash -l {0} + strategy: + fail-fast: false + matrix: + pyver: [ + { name: py39, distver: '3.9' }, + { name: py310, distver: '3.10'} + ] + platform: [ + { name: Windows, distver: windows-2022, upload: 'true' }, + { name: Windows, distver: windows-2019, upload: 'false' }, + { name: Linux, distver: ubuntu-20.04, upload: 'false' }, + { name: Linux, distver: ubuntu-18.04, upload: 'true' }, + { name: macOS, distver: macos-11, upload: 'true' }, + { name: macOS, distver: macos-10.15, upload: 'false' } + ] + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + - name: Download MacOSX SDK + if: ${{ matrix.platform.name == 'macOS' }} + run: | + curl -o MacOSX10.13.sdk.tar.xz -L https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX10.13.sdk.tar.xz && \ + tar xf MacOSX10.13.sdk.tar.xz && \ + sudo mv -v MacOSX10.13.sdk /opt/ && \ + ls /opt/ + - uses: seanmiddleditch/gha-setup-ninja@master + - uses: conda-incubator/setup-miniconda@v2 # https://github.com/conda-incubator/setup-miniconda + with: + activate-environment: conda-build + python-version: ${{ matrix.pyver.distver }} + environment-file: conda/environment.yml + - name: build, test and upload ifcopenshell + if: ${{ matrix.platform.upload == 'true' }} + run: | + conda-build . --python ${{ matrix.pyver.distver }} -c conda-forge --token ${{ secrets.ANACONDA_TOKEN }} --user ifcopenshell --no-remove-work-dir + - name: build & test ifcopenshell + if: ${{ matrix.platform.upload == 'false' }} + run: | + conda-build . --python ${{ matrix.pyver.distver }} -c conda-forge --no-remove-work-dir \ No newline at end of file diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 5d54cdcb93..ba5808d14b 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -452,30 +452,60 @@ if(NOT MINIMAL_BUILD AND HDF5_SUPPORT) if (HDF5_LIBRARY_DIR) # result of the HDF5 ctest package - - if (WIN32) - set(zlib_post lib) - set(lib_ext lib) - else() - set(lib_ext a) + # Find zlib using cmake find_library. How should this be implemented? + # FIND_LIBRARY(NAMES z libz libz_debug PATHS ... NO_DEFAULT_PATH) + + + if ("$ENV{CONDA_BUILD}" STREQUAL "") + # result of the HDF5 ctest package + + if (WIN32) + set(zlib_post lib) + set(lib_ext lib) + else() + set(lib_ext a) + endif() + + if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + set(debug_postfix "_debug") + endif() + + SET(HDF5_LIBRARIES + "${HDF5_LIBRARY_DIR}/libhdf5_cpp${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libhdf5${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libz${zlib_post}${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libsz${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libaec${debug_postfix}.${lib_ext}" + ) + + ELSE() + MESSAGE(STATUS "Packaging hdf5 and zlib for conda distribution") + if (WIN32) + # Windows + set(zlib_post zlib) + set(lib_ext lib) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + # macOS + set(zlib_post libz) + set(lib_ext dylib) + else() + # linux + set(zlib_post libz) + set(lib_ext so) + endif() + + SET(HDF5_LIBRARIES + "${HDF5_LIBRARY_DIR}/libhdf5_cpp.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libhdf5.${lib_ext}" + "${HDF5_LIBRARY_DIR}/${zlib_post}.${lib_ext}" + ) endif() - if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - set(debug_postfix "_debug") - endif() - - SET(HDF5_LIBRARIES - "${HDF5_LIBRARY_DIR}/libhdf5_cpp${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libhdf5${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libz${zlib_post}${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libsz${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libaec${debug_postfix}.${lib_ext}" - ) endif() - + if (NOT HDF5_LIBRARIES) # debian default - + SET(HDF5_LIBRARIES /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_cpp.so /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.so diff --git a/conda/Makefile b/conda/Makefile new file mode 100644 index 0000000000..3264931339 --- /dev/null +++ b/conda/Makefile @@ -0,0 +1,11 @@ +compile: + conda activate conda-build && conda-build -c conda-forge . --keep-old-work --python 3.10.4 + +debug: + conda activate conda-build && conda-debug -c conda-forge . --python 3.10.4 + +install: + conda env create -f environment.yml + +update: + conda env update -n conda-build --file environment.yml --prune \ No newline at end of file diff --git a/conda/bld.bat b/conda/bld.bat index 01f4d68f7c..8bd2df0051 100644 --- a/conda/bld.bat +++ b/conda/bld.bat @@ -1,29 +1,42 @@ mkdir build && cd build -REM Remove dot from PY_VER for use in library name -REM From https://github.com/tpaviot/pythonocc-core/blob/master/ci/conda/bld.bat set MY_PY_VER=%PY_VER:.=% +set LIBXML2="%LIBRARY_PREFIX%/lib/libxml2.lib" -cmake -G "NMake Makefiles" ^ - -DCMAKE_INSTALL_PREFIX="%LIBRARY_PREFIX%" ^ - -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_PREFIX_PATH="%LIBRARY_PREFIX%" ^ - -DCMAKE_SYSTEM_PREFIX_PATH="%LIBRARY_PREFIX%" ^ - -DPYTHON_EXECUTABLE="%PYTHON%" ^ - -DPYTHON_INCLUDE_DIR="%PREFIX%"/include ^ - -DPYTHON_LIBRARY="%PREFIX%"/libs/python%MY_PY_VER%.lib ^ - -DBOOST_LIBRARYDIR="%LIBRARY_PREFIX%\lib" ^ - -DBOOST_INCLUDEDIR="%LIBRARY_PREFIX%\include" ^ - -DOCC_INCLUDE_DIR="%LIBRARY_PREFIX%\include\oce" ^ - -DOCC_LIBRARY_DIR="%LIBRARY_PREFIX%\lib" ^ - -DCOLLADA_SUPPORT=Off ^ - -DBUILD_EXAMPLES=Off ^ - -DBUILD_GEOMSERVER=Off ^ - -DBUILD_CONVERT=Off ^ - ../cmake - +cmake -G "Ninja" ^ + -D CMAKE_BUILD_TYPE:STRING=Release ^ + -D CMAKE_INSTALL_PREFIX:FILEPATH="%LIBRARY_PREFIX%" ^ + -D CMAKE_PREFIX_PATH:FILEPATH="%LIBRARY_PREFIX%" ^ + -D CMAKE_SYSTEM_PREFIX_PATH:FILEPATH="%LIBRARY_PREFIX%" ^ + -D OCC_INCLUDE_DIR:FILEPATH="%LIBRARY_PREFIX%\include\opencascade" ^ + -D OCC_LIBRARY_DIR:FILEPATH="%LIBRARY_PREFIX%\lib" ^ + -D CGAL_INCLUDE_DIR:FILEPATH="%LIBRARY_PREFIX%\include" ^ + -D GMP_LIBRARY_DIR:FILEPATH="%LIBRARY_PREFIX%\lib" ^ + -D MPFR_LIBRARY_DIR:FILEPATH="%LIBRARY_PREFIX%\lib" ^ + -D COLLADA_SUPPORT=OFF ^ + -D HDF5_SUPPORT=ON ^ + -D HDF5_INCLUDE_DIR="%LIBRARY_PREFIX%\include" ^ + -D HDF5_LIBRARY_DIR="%LIBRARY_PREFIX%\lib" ^ + -D JSON_INCLUDE_DIR="%LIBRARY_PREFIX%\include" ^ + -D PYTHON_INCLUDE_DIR=%PREFIX%\include ^ + -D PYTHON_EXECUTABLE:FILEPATH=%PREFIX%\python.exe ^ + -D PYTHON_LIBRARY:FILEPATH="%PREFIX%"\libs/python%MY_PY_VER%.lib ^ + -D BUILD_IFCPYTHON=ON ^ + -D BUILD_IFCGEOM=ON ^ + -D COLLADA_SUPPORT:BOOL=OFF ^ + -D BUILD_EXAMPLES:BOOL=OFF ^ + -D BUILD_GEOMSERVER:BOOL=OFF ^ + -D GLTF_SUPPORT:BOOL=OFF ^ + -D BUILD_CONVERT:BOOL=ON ^ + -D BUILD_IFCMAX:BOOL=OFF ^ + -D IFCXML_SUPPORT:BOOL=OFF ^ + -D BOOST_LIBRARYDIR:FILEPATH="%LIBRARY_PREFIX%\lib" ^ + -D BOOST_INCLUDEDIR:FILEPATH="%LIBRARY_PREFIX%\include" ^ + -D BOOST_USE_STATIC_LIBS:BOOL=OFF ^ + %SRC_DIR%/cmake if errorlevel 1 exit 1 -cmake --build . --target INSTALL --config Release +:: Build and install +cmake --build . -- install if errorlevel 1 exit 1 diff --git a/conda/build.sh b/conda/build.sh index 83a32439f6..1732d2ca7d 100644 --- a/conda/build.sh +++ b/conda/build.sh @@ -1,34 +1,44 @@ -# From https://github.com/tpaviot/pythonocc-core/blob/master/ci/conda/build.sh -if [ "$PY3K" == "1" ]; then - MY_PY_VER="${PY_VER}m" -else - MY_PY_VER="${PY_VER}" +#!/bin/bash + +declare -a CMAKE_PLATFORM_FLAGS + +if [[ ${HOST} =~ .*linux.* ]]; then + CMAKE_PLATFORM_FLAGS+=(-DCMAKE_TOOLCHAIN_FILE=$RECIPE_DIR/cross-linux.cmake) fi if [ `uname` == Darwin ]; then - PY_LIB="libpython${MY_PY_VER}.dylib" - export CFLAGS="$CFLAGS -Wl,-flat_namespace,-undefined,suppress" - export CXXFLAGS="$CXXFLAGS -Wl,-flat_namespace,-undefined,suppress" - export LDFLAGS="$LDFLAGS -Wl,-flat_namespace,-undefined,suppress" -else - PY_LIB="libpython${MY_PY_VER}.so" + export CFLAGS="$CFLAGS -Wl,-flat_namespace,-undefined,suppress" + export CXXFLAGS="$CXXFLAGS -Wl,-flat_namespace,-undefined,suppress" + export LDFLAGS="$LDFLAGS -Wl,-flat_namespace,-undefined,suppress" fi -mkdir build && cd build - -cmake \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ +cmake -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + ${CMAKE_PLATFORM_FLAGS[@]} \ -DCMAKE_PREFIX_PATH=$PREFIX \ -DCMAKE_SYSTEM_PREFIX_PATH=$PREFIX \ - -DOCC_INCLUDE_DIR=$PREFIX/include/oce \ + -DPython3_FIND_STRATEGY=LOCATION \ + -DPython3_FIND_FRAMEWORK=NEVER \ + -DGMP_LIBRARY_DIR=$PREFIX/lib \ + -DMPFR_LIBRARY_DIR=$PREFIX/lib \ + -DOCC_INCLUDE_DIR=$PREFIX/include/opencascade \ -DOCC_LIBRARY_DIR=$PREFIX/lib \ - -DPYTHON_EXECUTABLE:FILEPATH=$PYTHON \ - -DPYTHON_INCLUDE_DIR:PATH=$PREFIX/include/python$MY_PY_VER \ - -DPYTHON_LIBRARY:FILEPATH=$PREFIX/lib/${PY_LIB} \ - -DCOLLADA_SUPPORT=Off \ - ../cmake + -DHDF5_SUPPORT:BOOL=ON \ + -DHDF5_INCLUDE_DIR=$PREFIX/include \ + -DHDF5_LIBRARY_DIR=$PREFIX/lib \ + -DJSON_INCLUDE_DIR=$PREFIX/include \ + -DCGAL_INCLUDE_DIR=$PREFIX/include \ + -DCOLLADA_SUPPORT=0 \ + -DBUILD_EXAMPLES:BOOL=OFF \ + -DIFCXML_SUPPORT:BOOL=OFF \ + -DBUILD_CONVERT:BOOL=ON \ + -DBUILD_IFCPYTHON:BOOL=ON \ + -DBUILD_IFCGEOM:BOOL=ON \ + -DBUILD_GEOMSERVER:BOOL=OFF \ + -DBOOST_USE_STATIC_LIBS:BOOL=OFF \ + ./cmake -make -j$CPU_COUNT _ifcopenshell_wrapper -cd ifcwrap -make install/local +ninja + +ninja install diff --git a/conda/conda_build_config.yaml b/conda/conda_build_config.yaml new file mode 100644 index 0000000000..5a72b972fe --- /dev/null +++ b/conda/conda_build_config.yaml @@ -0,0 +1,2 @@ +CONDA_BUILD_SYSROOT: + - /opt/MacOSX10.13.sdk # [osx] \ No newline at end of file diff --git a/conda/cross-linux.cmake b/conda/cross-linux.cmake new file mode 100644 index 0000000000..89834cda14 --- /dev/null +++ b/conda/cross-linux.cmake @@ -0,0 +1,16 @@ +# this one is important +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_PLATFORM Linux) + +# specify the cross compiler +set(CMAKE_C_COMPILER $ENV{CC}) +set(CMAKE_CXX_COMPILER $ENV{CXX}) + +# where is the target environment +set(CMAKE_FIND_ROOT_PATH $ENV{PREFIX} $ENV{BUILD_PREFIX}/$ENV{HOST}/sysroot) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) \ No newline at end of file diff --git a/conda/environment.yml b/conda/environment.yml new file mode 100644 index 0000000000..d77e4052fa --- /dev/null +++ b/conda/environment.yml @@ -0,0 +1,14 @@ +name: conda-build +channels: + - conda-forge +dependencies: + - conda-build + - conda-verify + - anaconda-client + - ninja + - doxygen + - ripgrep + - pip + - pip: + - --extra-index-url https://lief.s3-website.fr-par.scw.cloud/latest + - lief==0.13.0.dev0 \ No newline at end of file diff --git a/conda/meta.yaml b/conda/meta.yaml index 7b38d9d0f9..6142a14bb2 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -1,42 +1,77 @@ +{% set name = "ifcopenshell" %} +{% set version = "0.7.0" %} +{% set occt_version = "7.6.2" %} +{% set cgal_cpp_version = "5.3" %} +{% set hdf5_version = "1.12.1" %} + package: - name: ifcopenshell - version: "0.6.0a1" + name: {{ name }} + version: {{ version }} source: - git_rev: "v0.6.0a1" - git_url: https://github.com/IfcOpenShell/IfcOpenShell + path: .. build: - number: 0 - features: - - vc9 # [win and py27] - - vc10 # [win and py34] - - vc14 # [win and py35] - - vc14 # [win and py36] + binary_relocation: false [osx] requirements: build: - - gcc # [osx] - - make - - python - - oce ==0.18.3 + - {{ compiler('c') }} + - {{ compiler('cxx') }} + - ninja >=1.10.2 - cmake - - swig >=3.0.9 - - libboost - - icu - - xmlschema - - lxml - - numpy - run: - - libgcc # [osx] + - swig >=4.0.2 + + host: - python - - oce ==0.18.3 - - libboost - - icu - - xmlschema - - lxml + - occt >={{ occt_version }} + - hdf5 >={{ hdf5_version }} + - cgal-cpp >={{ cgal_cpp_version }} + - nlohmann_json + - libxml2 + + run: + - python + - occt >={{ occt_version }} + - cgal-cpp >={{ cgal_cpp_version }} + - hdf5 >={{ hdf5_version }} + - lark-parser + - deepdiff + - requests + - nlohmann_json + - isodate + - numpy >=1.17 + +test: + imports: + - ifcopenshell + requires: + - pytest + - pytest-cov - numpy - + - lxml + - isodate + - lark + - networkx + - xmlschema + #source_files: + # - src/ifcopenshell-python/test/api + # - src/ifcopenshell-python/test/util + # - src/ifcopenshell-python/test/bootstrap.py + # - src/ifcopenshell-python/test/test_file.py + # - src/ifcopenshell-python/test/test_wall_opening.py + # - src/ifcopenshell-python/test/__init__.py + #commands: + # #- pip install bcf-client + # - cd ../src/ifcopenshell-python/test && pytest -p no:pytest-blender + about: home: http://ifcopenshell.org - license: LGPL + license: LGPL-3.0-or-later + license_file: COPYING + summary: 'IfcOpenShell is a library to support the IFC file format' + description: | + IfcOpenShell is an open source (LGPL) software library for + working with the Industry Foundation Classes (IFC) file format. + doc_url: http://ifcopenshell.org/ + dev_url: https://github.com/IfcOpenShell/IfcOpenShell diff --git a/src/ifcgeom/IfcTrimmedCurve.cpp b/src/ifcgeom/IfcTrimmedCurve.cpp index e60a4ded90..a9f65ae539 100644 --- a/src/ifcgeom/IfcTrimmedCurve.cpp +++ b/src/ifcgeom/IfcTrimmedCurve.cpp @@ -31,7 +31,11 @@ #include #include #include + +#if OCC_VERSION_HEX < 0x70600 #include +#endif + #include #include "../ifcgeom/IfcGeom.h"