home-assistant: 2025.1.1 -> 2025.1.2 (#372513)
[NixPkgs.git] / pkgs / development / python-modules / ifcopenshell / default.nix
blob6ba4165a48351f7b247c6ea8117f62dc05b3e036
2   lib,
3   stdenv,
4   testers,
5   buildPythonPackage,
6   pythonOlder,
7   python,
8   pytestCheckHook,
9   # fetchers
10   fetchFromGitHub,
11   fetchpatch,
12   gitUpdater,
13   # build tools
14   cmake,
15   swig,
16   # native dependencies
17   eigen,
18   boost,
19   cgal,
20   gmp,
21   hdf5,
22   icu,
23   libaec,
24   libxml2,
25   mpfr,
26   nlohmann_json,
27   opencascade-occt_7_6,
28   opencollada,
29   pcre,
30   zlib,
32   # python deps
33   ## tools
34   setuptools,
35   build,
36   pytest,
37   ## dependencies
38   isodate,
39   lark,
40   numpy,
41   python-dateutil,
42   shapely,
43   typing-extensions,
44   ## additional deps for tests
45   ifcopenshell,
46   lxml,
47   mathutils,
48   networkx,
49   tabulate,
50   xmlschema,
51   xsdata,
53 let
54   opencascade-occt = opencascade-occt_7_6;
56 buildPythonPackage rec {
57   pname = "ifcopenshell";
58   version = "0.8.0";
59   pyproject = false;
61   src = fetchFromGitHub {
62     owner = "IfcOpenShell";
63     repo = "IfcOpenShell";
64     tag = "ifcopenshell-python-${version}";
65     fetchSubmodules = true;
66     hash = "sha256-tnj14lBEkUZNDM9J1sRhNA7OkWTWa5JPTSF8hui3q7k=";
67   };
69   patches = [
70     (fetchpatch {
71       name = "ifcopenshell-boost-1.86-mt19937.patch";
72       url = "https://github.com/IfcOpenShell/IfcOpenShell/commit/1fe168d331123920eeb9a96e542fcc1453de57fe.patch";
73       hash = "sha256-oZDEL8cPcEu83lW+qSvCbmDGYpaNNRrptW9MLu2pN70=";
74     })
76     (fetchpatch {
77       name = "ifcopenshell-boost-1.86-json.patch";
78       url = "https://github.com/IfcOpenShell/IfcOpenShell/commit/88b861737c7c206d0e7307f90d37467e9585515c.patch";
79       hash = "sha256-zMoQcBWRdtavL0xdsr53SqyG6CZoeon8/mmJhrw85lc=";
80     })
81   ];
83   nativeBuildInputs = [
84     # c++
85     cmake
86     swig
87     # python
88     build
89     setuptools
90   ];
92   buildInputs = [
93     # ifcopenshell needs stdc++
94     (lib.getLib stdenv.cc.cc)
95     boost
96     cgal
97     eigen
98     gmp
99     hdf5
100     icu
101     libaec
102     libxml2
103     mpfr
104     nlohmann_json
105     opencascade-occt
106     opencollada
107     pcre
108   ];
110   propagatedBuildInputs = [
111     isodate
112     lark
113     numpy
114     python-dateutil
115     shapely
116     typing-extensions
117   ];
119   # list taken from .github/workflows/ci.yml:49
120   nativeCheckInputs = [
121     lxml
122     mathutils
123     networkx
124     pytest
125     tabulate
126     xmlschema
127     xsdata
129     pytestCheckHook
130   ];
132   pythonImportsCheck = [ "ifcopenshell" ];
134   PYTHONUSERBASE = ".";
136   # We still build with python to generate ifcopenshell_wrapper.py and ifcopenshell_wrapper.so
137   cmakeFlags = [
138     "-DUSERSPACE_PYTHON_PREFIX=ON"
139     "-DBUILD_SHARED_LIBS=ON"
140     "-DBUILD_IFCPYTHON=ON"
141     "-DCITYJSON_SUPPORT=OFF"
142     "-DEIGEN_DIR=${eigen}/include/eigen3"
143     "-DJSON_INCLUDE_DIR=${nlohmann_json}/include/"
144     "-DOCC_INCLUDE_DIR=${opencascade-occt}/include/opencascade"
145     "-DOCC_LIBRARY_DIR=${lib.getLib opencascade-occt}/lib"
146     "-DOPENCOLLADA_INCLUDE_DIR=${opencollada}/include/opencollada"
147     "-DOPENCOLLADA_LIBRARY_DIR=${lib.getLib opencollada}/lib/opencollada"
148     "-DSWIG_EXECUTABLE=${swig}/bin/swig"
149     "-DLIBXML2_INCLUDE_DIR=${libxml2.dev}/include/libxml2"
150     "-DLIBXML2_LIBRARIES=${lib.getLib libxml2}/lib/libxml2${stdenv.hostPlatform.extensions.sharedLibrary}"
151     "-DGMP_LIBRARY_DIR=${lib.getLib gmp}/lib/"
152     "-DMPFR_LIBRARY_DIR=${lib.getLib mpfr}/lib/"
153     # HDF5 support is currently not optional, see https://github.com/IfcOpenShell/IfcOpenShell/issues/1815
154     "-DHDF5_SUPPORT=ON"
155     "-DHDF5_INCLUDE_DIR=${hdf5.dev}/include/"
156     "-DHDF5_LIBRARIES=${lib.getLib hdf5}/lib/libhdf5_cpp.so;${lib.getLib hdf5}/lib/libhdf5.so;${lib.getLib zlib}/lib/libz.so;${lib.getLib libaec}/lib/libaec.so;"
157   ];
159   postPatch = ''
160     pushd src/ifcopenshell-python
161     # The build process is here: https://github.com/IfcOpenShell/IfcOpenShell/blob/v0.8.0/src/ifcopenshell-python/Makefile#L131
162     # NOTE: it has changed a *lot* between 0.7.0 and 0.8.0, it *may* change again (look for mathutils and basically all the things this Makefile does manually)
163     substituteInPlace pyproject.toml --replace-fail "0.0.0" "${version}"
164     # NOTE: the following is directly inspired by https://github.com/IfcOpenShell/IfcOpenShell/blob/v0.8.0/src/ifcopenshell-python/Makefile#L123
165     cp ../../README.md README.md
166     popd
167   '';
169   preConfigure = ''
170     cd cmake
171   '';
173   preCheck = ''
174     pushd ../../src/ifcopenshell-python
175     # let's test like done in .github/workflows/ci.yml
176     # installing the python wrapper and the .so, both are needed to be able to test
177     cp -v $out/${python.sitePackages}/ifcopenshell/ifcopenshell_wrapper.py ./ifcopenshell
178     cp $out/${python.sitePackages}/ifcopenshell/_ifcopenshell_wrapper.cpython-${
179       lib.versions.major python.version + lib.versions.minor python.version
180     }-${stdenv.targetPlatform.system}-gnu.so ./ifcopenshell
181     pushd ../../test
182     PYTHONPATH=../src/ifcopenshell-python/ python tests.py
183     popd
184   '';
186   pytestFlagsArray = [
187     "-p no:pytest-blender"
188   ];
190   disabledTestPaths = [
191     "test/test_open.py"
192   ];
194   postCheck = ''
195     popd
196   '';
198   passthru = {
199     updateScript = gitUpdater { rev-prefix = "ifcopenshell-python-"; };
200     tests = {
201       version = testers.testVersion {
202         command = "IfcConvert --version";
203         package = ifcopenshell;
204       };
205     };
206   };
208   meta = with lib; {
209     broken = stdenv.hostPlatform.isDarwin;
210     description = "Open source IFC library and geometry engine";
211     homepage = "http://ifcopenshell.org/";
212     license = licenses.lgpl3;
213     maintainers = with maintainers; [ autra ];
214   };