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