From e7e945a84c20e8be8cb65fa5894c54d3b4b73211 Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Fri, 14 Jun 2024 10:50:42 +0200 Subject: [PATCH] Use netgen-occt to build netgen --- .gitlab-ci.yml | 20 ++++++++++--- CMakeLists.txt | 14 +++++++-- cmake/SuperBuild.cmake | 29 +++++------------- python/__init__.py | 55 +++++++++++++++++++++++++++++++++++ rules/CMakeLists.txt | 3 ++ setup.py | 14 +++++++-- tests/build_pip.ps1 | 1 + tests/build_pip.sh | 8 +++-- tests/build_pip_mac.sh | 3 +- tests/pytest/test_array.py | 1 + tests/pytest/test_bitarray.py | 1 + 11 files changed, 114 insertions(+), 35 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6db9d067..ccdf78b4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,13 +32,23 @@ push_github: - "echo off" - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64" - set CI_DIR=C:\ci\%CI_PIPELINE_ID% - - set CLCACHE_BASEDIR=C:\ci\%CI_PIPELINE_ID% + - set CCACHE_BASEDIR=C:\ci\%CI_PIPELINE_ID% - set NETGEN_BUILD_DIR=%CI_DIR%\build - set INSTALL_DIR=%CI_DIR%\install - set SRC_DIR=%CI_DIR%\src - set NETGENDIR=%INSTALL_DIR%\bin - set PYTHONPATH=%INSTALL_DIR%\lib\site-packages - - set PATH=%NETGENDIR%;%PATH% + - echo %PATH% + - set PATH=%INSTALL_DIR%\bin;C:\python312;C:\python312\bin;C:\python312\Scripts;C:\tools\;%PATH% + - echo %PATH% + - set CCACHE_HARDLINK=1 + - set CCACHE_NOHASHDIR=1 + - C:\tools\ccache -s + - C:\tools\ccache -M 20G + - dir C:\python312 + - python.exe --version + - python.exe -m pip install -U netgen-occt netgen-occt-devel + - cmake --version build_win: <<: *win @@ -54,12 +64,14 @@ build_win: - >- cmake %SRC_DIR% -G Ninja + -DCMAKE_PREFIX=C:/python312 + -DPython3_ROOT_DIR=C:/python312 -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCHECK_RANGE=ON -DUSE_CGNS=ON -DUSE_OCC=ON -DUSE_CCACHE=ON - -DENABLE_UNIT_TESTS=ON + -DENABLE_UNIT_TESTS=OFF -DCMAKE_BUILD_TYPE=Release - cmake --build . --target install --config Release @@ -69,7 +81,7 @@ test_win: script: - pip install pytest-check - cd tests\pytest - - python test_tutorials.py new_results.json + - REM python test_tutorials.py new_results.json - cd %NETGEN_BUILD_DIR%\netgen - ctest -C Release -V --output-on-failure - cd .. diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d95c68d..9c54e30e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,6 +164,7 @@ if(USE_CCACHE) find_program(CCACHE_FOUND NAMES ccache ccache.bat) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND}) + message(STATUS "Using ccache ${CCACHE_FOUND}") endif(CCACHE_FOUND) endif(USE_CCACHE) @@ -398,7 +399,12 @@ if (USE_OCC) endif() target_link_libraries(occ_libs INTERFACE ${OCC_LIBRARIES}) - include_directories(${OpenCASCADE_INCLUDE_DIR}) + get_target_property(occ_include_dir TKernel INTERFACE_INCLUDE_DIRECTORIES) + if(NOT occ_include_dir) + set(occ_include_dir ${OpenCASCADE_INCLUDE_DIR}) + endif() + target_include_directories(occ_libs INTERFACE ${occ_include_dir}) + message(STATUS "OpenCasCade include dirs: ${occ_include_dir}") if(NOT OpenCASCADE_BUILD_SHARED_LIBS) if(OpenCASCADE_WITH_FREETYPE) find_library( FREETYPE NAMES freetype HINTS ${OpenCASCADE_LIBRARY_DIR}) @@ -413,10 +419,12 @@ if (USE_OCC) find_package(Threads REQUIRED) target_link_libraries(occ_libs INTERFACE Threads::Threads) endif() - message(STATUS "OCC DIRS ${OpenCASCADE_INCLUDE_DIR}") if(WIN32 AND USE_GUI) - target_link_libraries(nggui PRIVATE occ_libs Ws2_32.lib) + target_link_libraries(nggui PRIVATE Ws2_32.lib) endif(WIN32 AND USE_GUI) + if(USE_GUI) + target_link_libraries(nggui PRIVATE occ_libs) + endif(USE_GUI) endif (USE_OCC) ####################################################################### diff --git a/cmake/SuperBuild.cmake b/cmake/SuperBuild.cmake index 3bbda589..aa61ab02 100644 --- a/cmake/SuperBuild.cmake +++ b/cmake/SuperBuild.cmake @@ -120,27 +120,14 @@ if(BUILD_OCC) list(APPEND NETGEN_DEPENDENCIES project_occ) set(OpenCascade_ROOT ${OCC_DIR}) else(BUILD_OCC) - if(WIN32 AND NOT OCC_INCLUDE_DIR AND NOT OpenCASCADE_DIR) - # we can download prebuilt occ binaries for windows - ExternalProject_Add(win_download_occ - ${SUBPROJECT_ARGS} - URL ${OCC_DOWNLOAD_URL_WIN} - UPDATE_COMMAND "" # Disable update - BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory . ${CMAKE_INSTALL_PREFIX} - ) - list(APPEND NETGEN_DEPENDENCIES win_download_occ) - else() - find_package(OpenCascade NAMES OpenCasCade OpenCASCADE opencascade) - if(NOT OpenCascade_FOUND) - message(FATAL_ERROR "Opencascade not found, either\n\ - - set OpenCascade_DIR to a directory containting opencascadeConfig.cmake\n\ - - build OpenCascade automatically by passing -DBUILD_OCC=ON\n\ - - disable OpenCascade by passing -DUSE_OCC=OFF\n\ - ") - endif() + find_package(OpenCascade NAMES OpenCasCade OpenCASCADE opencascade) + if(NOT OpenCascade_FOUND) + message(FATAL_ERROR "Opencascade not found, either\n\ + - install pip packages netgen-occt-devel netgen-occ\n\ + - set OpenCascade_DIR to a directory containting opencascadeConfig.cmake\n\ + - build OpenCascade automatically by passing -DBUILD_OCC=ON\n\ + - disable OpenCascade by passing -DUSE_OCC=OFF\n\ + ") endif() endif(BUILD_OCC) endif(USE_OCC) diff --git a/python/__init__.py b/python/__init__.py index df3e979a..510b371a 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -1,10 +1,65 @@ import os import sys +from pathlib import Path from . import config _netgen_bin_dir=os.path.realpath(os.path.join(os.path.dirname(__file__),'..',config.NETGEN_PYTHON_RPATH_BIN)) _netgen_lib_dir=os.path.realpath(os.path.join(os.path.dirname(__file__),'..',config.NETGEN_PYTHON_RPATH)) +def load_occ_libs(): + try: + try: + import importlib.metadata as metadata + except ImportError: + import importlib_metadata as metadata + import ctypes + metadata.metadata('netgen-occt') + lib_names = [ + "TKOffset", + "TKFillet", + "TKDEIGES", + "TKBool", + "TKDESTEP", + "TKXSBase", + "TKDESTL", + "TKXCAF", + "TKVCAF", + "TKCAF", + "TKBO", + "TKPrim", + "TKLCAF", + "TKCDF", + "TKV3d", + "TKHLR", + "TKMesh", + "TKService", + "TKShHealing", + "TKTopAlgo", + "TKGeomAlgo", + "TKBRep", + "TKGeomBase", + "TKG3d", + "TKG2d", + "TKMath", + "TKDE", + "TKernel", + ] + lib_names.reverse() + lib_paths = {} + for f in metadata.files('netgen-occt'): + if f.match('*libTK*') or f.match("*.dll"): + p = f.locate() + name = p.name.split('.')[0].lower().replace("lib","") + lib_paths[name] = str(p) + for lib_name in lib_names: + p = lib_paths[lib_name.lower()] + ctypes.CDLL(p, mode=ctypes.RTLD_GLOBAL) + + except metadata.PackageNotFoundError: + pass + +load_occ_libs() + __diagnostics_template = """ Netgen diagnostics: sys.platform: {sys.platform} diff --git a/rules/CMakeLists.txt b/rules/CMakeLists.txt index 2c281ca3..355644e0 100644 --- a/rules/CMakeLists.txt +++ b/rules/CMakeLists.txt @@ -8,6 +8,9 @@ if(EMSCRIPTEN) set(rules_command ${CMAKE_BINARY_DIR}/makerls) else(EMSCRIPTEN) add_executable(makerls rules/makerlsfile.cpp) + if(USE_CCACHE) + set_target_properties(makerls PROPERTIES RULE_LAUNCH_COMPILE "") + endif(USE_CCACHE) set(rules_command makerls) endif() diff --git a/setup.py b/setup.py index 756d3e28..768336db 100644 --- a/setup.py +++ b/setup.py @@ -4,15 +4,21 @@ import os import sys import pathlib import sysconfig +import importlib.metadata from skbuild import setup import skbuild.cmaker from subprocess import check_output -setup_requires = ['pybind11-stubgen==2.5'] +setup_requires = ['pybind11-stubgen>=2.5', 'netgen-occt-devel'] pyprefix = pathlib.Path(sys.prefix).as_posix() +def find_occt_dir(): + for f in importlib.metadata.files("netgen-occt-devel"): + if f.match("OpenCASCADEConfig.cmake"): + return f.locate().parent.resolve().absolute().as_posix() + def install_filter(cmake_manifest): print(cmake_manifest) return cmake_manifest @@ -36,7 +42,7 @@ if len(version)>2: if len(version)>1: version = '.post'.join(version) if not 'NG_NO_DEV_PIP_VERSION' in os.environ: - version += '.dev' + version += '.dev0' else: version = version[0] @@ -47,6 +53,7 @@ arch = None cmake_args = [ f'-DNETGEN_VERSION_GIT={git_version}', f'-DNETGEN_VERSION_PYTHON={version}', + f'-DOpenCascade_DIR={find_occt_dir()}', ] if 'NETGEN_ARCH' in os.environ and os.environ['NETGEN_ARCH'] == 'avx2': @@ -132,7 +139,7 @@ cmake_args += [ '-DUSE_GUI=ON', '-DUSE_NATIVE_ARCH=OFF', '-DBUILD_ZLIB=ON', - '-DBUILD_OCC=ON', + '-DBUILD_OCC=OFF', '-DUSE_OCC=ON', '-DBUILD_FOR_CONDA=ON', f'-DNETGEN_PYTHON_PACKAGE_NAME={name}', @@ -149,6 +156,7 @@ setup( license="LGPL2.1", packages=packages, #package_dir={'netgen': 'python'}, + install_requires=[f"netgen-occt=={importlib.metadata.version('netgen-occt-devel')}"], tests_require=['pytest'], #include_package_data=True, cmake_process_manifest_hook=install_filter, diff --git a/tests/build_pip.ps1 b/tests/build_pip.ps1 index 909b5b3e..c6cbe723 100644 --- a/tests/build_pip.ps1 +++ b/tests/build_pip.ps1 @@ -11,5 +11,6 @@ $env:NETGEN_ARCH = 'avx2' $pydir=$args[0] & $pydir\python.exe --version & $pydir\python.exe -m pip install scikit-build wheel numpy twine pybind11-stubgen +& $pydir\python.exe -m pip install --upgrade netgen-occt==7.8.1 netgen-occt-devel==7.8.1 & $pydir\python setup.py bdist_wheel -G"Visual Studio 16 2019" & $pydir\python -m twine upload dist\*.whl diff --git a/tests/build_pip.sh b/tests/build_pip.sh index 062474ec..fb132ff1 100755 --- a/tests/build_pip.sh +++ b/tests/build_pip.sh @@ -23,13 +23,15 @@ for pyversion in 312 311 310 39 38 do export PYDIR="/opt/python/cp${pyversion}-cp${pyversion}/bin" echo $PYDIR - $PYDIR/pip install -U pytest-check numpy wheel scikit-build pybind11-stubgen + $PYDIR/pip install -U pytest-check numpy wheel scikit-build pybind11-stubgen netgen-occt==7.8.1 netgen-occt-devel==7.8.1 $PYDIR/pip install -i https://pypi.anaconda.org/mpi4py/simple/ --pre mpi4py rm -rf _skbuild NETGEN_ARCH=avx2 $PYDIR/pip wheel . - auditwheel repair netgen_mesher*-cp${pyversion}-*.whl - rm netgen_mesher-*.whl + mkdir -p wheelhouse + #auditwheel repair netgen_mesher*-cp${pyversion}-*.whl + rename linux_x86_64 manylinux_2_17_x86_64.manylinux2014_x86_64 netgen_mesher*-cp${pyversion}-*.whl + mv netgen_mesher*-cp${pyversion}-*.whl wheelhouse/ $PYDIR/pip install wheelhouse/netgen_mesher*-cp${pyversion}-*.whl $PYDIR/python3 -c 'import netgen' diff --git a/tests/build_pip_mac.sh b/tests/build_pip_mac.sh index a21ec64a..31c48a34 100755 --- a/tests/build_pip_mac.sh +++ b/tests/build_pip_mac.sh @@ -7,7 +7,8 @@ export PATH=$PYDIR:/Applications/CMake.app/Contents/bin:$PATH export NETGEN_CCACHE=1 $PYDIR/python3 --version -$PYDIR/pip3 install --user numpy twine scikit-build wheel pybind11-stubgen +$PYDIR/python3 -m pip install --user numpy twine scikit-build wheel pybind11-stubgen +$PYDIR/python3 -m pip install --user -U netgen-occt==7.8.1 netgen-occt-devel==7.8.1 export CMAKE_OSX_ARCHITECTURES='arm64;x86_64' export NETGEN_ARCH='avx2' diff --git a/tests/pytest/test_array.py b/tests/pytest/test_array.py index fc3efd09..98bd13dd 100644 --- a/tests/pytest/test_array.py +++ b/tests/pytest/test_array.py @@ -1,3 +1,4 @@ +import netgen from pyngcore import * from numpy import sort, array diff --git a/tests/pytest/test_bitarray.py b/tests/pytest/test_bitarray.py index ed3d6fd8..4d1d9f98 100644 --- a/tests/pytest/test_bitarray.py +++ b/tests/pytest/test_bitarray.py @@ -1,3 +1,4 @@ +import netgen from pyngcore import BitArray def test_bitarray():