1{ lib
2, stdenv
3, buildPythonPackage
4, fetchFromGitHub
5, cmake
6, comic-neue
7, boost
8, catch2
9, inchi
10, cairo
11, eigen
12, python
13, rapidjson
14, maeparser
15, coordgenlibs
16, numpy
17, pandas
18, pillow
19, memorymappingHook
20}:
21let
22 external = {
23 avalon = fetchFromGitHub {
24 owner = "rdkit";
25 repo = "ava-formake";
26 rev = "AvalonToolkit_2.0.5-pre.3";
27 hash = "sha256-2MuFZgRIHXnkV7Nc1da4fa7wDx57VHUtwLthrmjk+5o=";
28 };
29 yaehmop = fetchFromGitHub {
30 owner = "greglandrum";
31 repo = "yaehmop";
32 rev = "v2023.03.1";
33 hash = "sha256-K9//cDN69U4sLETfIZq9NUaBE3RXOReH53qfiCzutqM=";
34 };
35 freesasa = fetchFromGitHub {
36 owner = "mittinatten";
37 repo = "freesasa";
38 rev = "2.0.3";
39 hash = "sha256-7E+imvfDAJFnXQRWb5hNaSu+Xrf9NXeIKc9fl+o3yHQ=";
40 };
41 };
42in
43buildPythonPackage rec {
44 pname = "rdkit";
45 version = "2023.09.1";
46 format = "other";
47
48 src =
49 let
50 versionTag = lib.replaceStrings [ "." ] [ "_" ] version;
51 in
52 fetchFromGitHub {
53 owner = pname;
54 repo = pname;
55 rev = "Release_${versionTag}";
56 hash = "sha256-qaYD/46oCTnso1FbD08zr2JuatKmSSqNBhOYlfeIiAA=";
57 };
58
59 unpackPhase = ''
60 cp -r $src/* .
61 find . -type d -exec chmod +w {} +
62
63 mkdir External/AvalonTools/avalon
64 # In buildPhase, CMake patches the file in this directory
65 # see https://github.com/rdkit/rdkit/pull/5928
66 cp -r ${external.avalon}/* External/AvalonTools/avalon
67
68 mkdir External/YAeHMOP/yaehmop
69 ln -s ${external.yaehmop}/* External/YAeHMOP/yaehmop
70
71 mkdir -p External/FreeSASA/freesasa
72 cp -r ${external.freesasa}/* External/FreeSASA/freesasa
73 chmod +w External/FreeSASA/freesasa/src
74 cp External/FreeSASA/freesasa2.c External/FreeSASA/freesasa/src
75
76 ln -s ${rapidjson} External/rapidjson-1.1.0
77 ln -s ${comic-neue}/share/fonts/truetype/ComicNeue-Regular.ttf Data/Fonts/
78 '';
79
80 nativeBuildInputs = [
81 cmake
82 ];
83
84 buildInputs = [
85 boost
86 cairo
87 ] ++ lib.optionals (stdenv.system == "x86_64-darwin") [
88 memorymappingHook
89 ];
90
91 propagatedBuildInputs = [
92 numpy
93 pandas
94 pillow
95 ];
96
97 hardeningDisable = [ "format" ]; # required by yaehmop
98
99 dontUseSetuptoolsBuild = true;
100 dontUsePipInstall = true;
101 dontUseSetuptoolsCheck = true;
102
103 preConfigure = ''
104 # Since we can't expand with bash in cmakeFlags
105 cmakeFlags="$cmakeFlags -DPYTHON_NUMPY_INCLUDE_PATH=$(${python}/bin/python -c 'import numpy; print(numpy.get_include())')"
106 cmakeFlags="$cmakeFlags -DFREESASA_DIR=$PWD/External/FreeSASA/freesasa"
107 cmakeFlags="$cmakeFlags -DFREESASA_SRC_DIR=$PWD/External/FreeSASA/freesasa"
108 cmakeFlags="$cmakeFlags -DAVALONTOOLS_DIR=$PWD/External/AvalonTools/avalon"
109 '';
110
111 cmakeFlags = [
112 "-DCATCH_DIR=${catch2}/include/catch2"
113 "-DINCHI_LIBRARY=${inchi}/lib/libinchi.so"
114 "-DINCHI_LIBRARIES=${inchi}/lib/libinchi.so"
115 "-DINCHI_INCLUDE_DIR=${inchi}/include/inchi"
116 "-DEIGEN3_INCLUDE_DIR=${eigen}/include/eigen3"
117 "-DRDK_INSTALL_INTREE=OFF"
118 "-DRDK_INSTALL_STATIC_LIBS=OFF"
119 "-DRDK_BUILD_INCHI_SUPPORT=ON"
120 "-DRDK_BUILD_AVALON_SUPPORT=ON"
121 "-DRDK_BUILD_FREESASA_SUPPORT=ON"
122 "-DRDK_BUILD_YAEHMOP_SUPPORT=ON"
123 "-DRDK_BUILD_MAEPARSER_SUPPORT=ON"
124 "-DMAEPARSER_DIR=${maeparser}"
125 "-DRDK_BUILD_COORDGEN_SUPPORT=ON"
126 "-DCOORDGEN_DIR=${coordgenlibs}"
127 "-DRDK_USE_URF=OFF"
128 "-DRDK_USE_FLEXBISON=OFF"
129 "-DRDK_BUILD_CAIRO_SUPPORT=ON"
130 "-DRDK_BUILD_THREADSAFE_SSS=ON"
131 "-DRDK_TEST_MULTITHREADED=ON"
132 "-DRDK_BUILD_CPP_TESTS=ON"
133 "-DRDK_TEST_MULTITHREADED=ON"
134 "-DPYTHON_EXECUTABLE=${python}/bin/python"
135 "-DBOOST_ROOT=${boost}"
136 "-DBoost_NO_SYSTEM_PATHS=ON"
137 "-DBoost_NO_BOOST_CMAKE=TRUE"
138 "-DCMAKE_SKIP_BUILD_RPATH=ON" # fails to find libs in pythonImportsCheckPhase otherwise
139 ];
140
141 checkPhase = ''
142 export QT_QPA_PLATFORM='offscreen'
143 export RDBASE=$(realpath ..)
144 export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
145 (cd $RDBASE/rdkit/Chem && python $RDBASE/rdkit/TestRunner.py test_list.py)
146 '';
147
148 pythonImportsCheck = [
149 "rdkit"
150 "rdkit.Chem"
151 "rdkit.Chem.AllChem"
152 ];
153
154 meta = with lib; {
155 description = "Open source toolkit for cheminformatics";
156 maintainers = with maintainers; [ rmcgibbo natsukium ];
157 license = licenses.bsd3;
158 homepage = "https://www.rdkit.org";
159 changelog = "https://github.com/rdkit/rdkit/releases/tag/${src.rev}";
160 };
161}