diff --git a/packages/gmsh/meta.yaml b/packages/gmsh/meta.yaml new file mode 100644 index 00000000..98e4b7d1 --- /dev/null +++ b/packages/gmsh/meta.yaml @@ -0,0 +1,42 @@ +package: + name: gmsh + version: 4.15.1 + top-level: + - gmsh +source: + url: https://gmsh.info/src/gmsh-4.15.1-source.tgz + sha256: eba8e4064f6586c8ca880f1cfdf697f4d70f026f398a93b458f247f7e4364fed + patches: + - patches/0001-pyodide-library-loading.patch + +requirements: + host: + - libgmsh + run: + - libgmsh + - numpy + +build: + script: | + cat > setup.py << 'EOF' + from setuptools import setup + setup( + name="gmsh", + version="4.15.1", + py_modules=["gmsh"], + package_dir={"": "api"}, + ) + EOF + +test: + imports: + - gmsh + +about: + home: https://gmsh.info + PyPI: https://pypi.org/project/gmsh + license: GPL-2.0-or-later + summary: Gmsh Python API for mesh generation +extra: + recipe-maintainers: + - pepijndevos diff --git a/packages/gmsh/patches/0001-pyodide-library-loading.patch b/packages/gmsh/patches/0001-pyodide-library-loading.patch new file mode 100644 index 00000000..504a12ef --- /dev/null +++ b/packages/gmsh/patches/0001-pyodide-library-loading.patch @@ -0,0 +1,30 @@ +diff --git a/api/gmsh.py b/api/gmsh.py +index a666f46..0e59b91 100644 +--- a/api/gmsh.py ++++ b/api/gmsh.py +@@ -89,7 +89,7 @@ if not libpath: + " with ctypes.util.find_library() or in the following locations: " + + str(possible_libpaths)) + +-lib = CDLL(libpath) ++lib = CDLL("libgmsh.so") + + try_numpy = True # set this to False to never use numpy + +@@ -292,7 +292,7 @@ def initialize(argv=[], readConfigFiles=True, run=False, interruptible=True): + c_int(bool(run)), + byref(ierr)) + if interruptible == True: +- prev_interrupt_handler = signal.signal(signal.SIGINT, signal.SIG_DFL) ++ pass + if ierr.value != 0: + raise Exception(logger.getLastError()) + +@@ -323,7 +323,7 @@ def finalize(): + lib.gmshFinalize( + byref(ierr)) + if prev_interrupt_handler is not None: +- signal.signal(signal.SIGINT, prev_interrupt_handler) ++ pass + if ierr.value != 0: + raise Exception(logger.getLastError()) diff --git a/packages/gmsh/test_gmsh.py b/packages/gmsh/test_gmsh.py new file mode 100644 index 00000000..0911564e --- /dev/null +++ b/packages/gmsh/test_gmsh.py @@ -0,0 +1,38 @@ +from pytest_pyodide import run_in_pyodide + + +@run_in_pyodide(packages=["gmsh"]) +def test_gmsh_initialize(selenium): + import gmsh + + gmsh.initialize() + assert gmsh.isInitialized() == 1 + gmsh.finalize() + + +@run_in_pyodide(packages=["gmsh"]) +def test_gmsh_mesh_2d(selenium): + import gmsh + + gmsh.initialize() + gmsh.model.add("test") + + # Create a square using the built-in GEO kernel + gmsh.model.geo.addPoint(0, 0, 0, 1.0, 1) + gmsh.model.geo.addPoint(1, 0, 0, 1.0, 2) + gmsh.model.geo.addPoint(1, 1, 0, 1.0, 3) + gmsh.model.geo.addPoint(0, 1, 0, 1.0, 4) + gmsh.model.geo.addLine(1, 2, 1) + gmsh.model.geo.addLine(2, 3, 2) + gmsh.model.geo.addLine(3, 4, 3) + gmsh.model.geo.addLine(4, 1, 4) + gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) + gmsh.model.geo.addPlaneSurface([1], 1) + gmsh.model.geo.synchronize() + + gmsh.model.mesh.generate(2) + + node_tags, coords, _ = gmsh.model.mesh.getNodes() + assert len(node_tags) > 4 # More than just corner nodes + + gmsh.finalize() diff --git a/packages/libgmsh/meta.yaml b/packages/libgmsh/meta.yaml new file mode 100644 index 00000000..8f7efce6 --- /dev/null +++ b/packages/libgmsh/meta.yaml @@ -0,0 +1,83 @@ +package: + name: libgmsh + version: 4.15.1 + tag: + - library + - shared_library +source: + url: https://gmsh.info/src/gmsh-4.15.1-source.tgz + sha256: eba8e4064f6586c8ca880f1cfdf697f4d70f026f398a93b458f247f7e4364fed + +requirements: + host: + - libgmp + +build: + type: shared_library + script: | + embuilder build zlib --pic + + mkdir -p build && cd build + emcmake cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$WASM_LIBRARY_DIR \ + -DENABLE_BUILD_SHARED=ON \ + -DGMSH_RELEASE=1 \ + \ + -DCMAKE_C_FLAGS="${SIDE_MODULE_CFLAGS}" \ + -DCMAKE_CXX_FLAGS="${SIDE_MODULE_CXXFLAGS}" \ + -DCMAKE_SHARED_LINKER_FLAGS="${SIDE_MODULE_LDFLAGS}" \ + \ + -DENABLE_FLTK=OFF \ + -DENABLE_OCC=OFF \ + -DENABLE_OCC_CAF=OFF \ + -DENABLE_OPENMP=OFF \ + -DENABLE_GRAPHICS=OFF \ + -DENABLE_OSMESA=OFF \ + -DENABLE_CAIRO=OFF \ + -DENABLE_MPEG_ENCODE=OFF \ + -DENABLE_TESTS=OFF \ + -DENABLE_TOUCHBAR=OFF \ + -DENABLE_MED=OFF \ + -DENABLE_CGNS=OFF \ + -DENABLE_GETDP=OFF \ + -DENABLE_MMG=OFF \ + -DENABLE_GEOMETRYCENTRAL=OFF \ + -DENABLE_NII2MESH=OFF \ + -DENABLE_PRIVATE_API=OFF \ + \ + -DENABLE_MESH=ON \ + -DENABLE_SOLVER=ON \ + -DENABLE_POST=ON \ + -DENABLE_PARSER=ON \ + -DENABLE_PLUGINS=ON \ + -DENABLE_EIGEN=ON \ + -DENABLE_NETGEN=ON \ + -DENABLE_METIS=ON \ + -DENABLE_HXT=ON \ + -DENABLE_BAMG=ON \ + -DENABLE_BLOSSOM=ON \ + -DENABLE_ANN=ON \ + -DENABLE_ALGLIB=ON \ + -DENABLE_GMP=ON \ + -DENABLE_KBIPACK=ON \ + -DENABLE_ONELAB=ON \ + \ + -DGMP_LIB=$WASM_LIBRARY_DIR/lib/libgmp.a \ + -DGMP_INC=$WASM_LIBRARY_DIR/include \ + \ + -DSIZEOF_SIZE_T=4 \ + -DHAVE_64BIT_SIZE_T=OFF + + emmake make -j ${PYODIDE_JOBS:-16} + emmake make install + + cp ${WASM_LIBRARY_DIR}/lib/libgmsh.so ${DISTDIR} + +about: + home: https://gmsh.info + license: GPL-2.0-or-later + summary: A three-dimensional finite element mesh generator with built-in CAD engine +extra: + recipe-maintainers: + - pepijndevos