1{ lib
2, buildPythonPackage
3, fetchFromGitHub
4, fetchzip
5, cmake
6, boost
7, catch2
8, inchi
9, cairo
10, eigen
11, python
12, rapidjson
13, maeparser
14, coordgenlibs
15, numpy
16, pandas
17, pillow
18, git
19}:
20let
21 external = {
22 avalon = fetchzip {
23 url = "http://sourceforge.net/projects/avalontoolkit/files/AvalonToolkit_1.2/AvalonToolkit_1.2.0.source.tar";
24 sha256 = "0nhxfxckb5a5qs0g148f55yarhncqjgjzcvdskkv9rxi2nrs7160";
25 stripRoot = false;
26 };
27 yaehmop = fetchFromGitHub {
28 owner = "greglandrum";
29 repo = "yaehmop";
30 rev = "cfb5aeebbdf5ae93c4f4eeb14c7a507dea54ae9e";
31 sha256 = "sha256-QMnc5RyHlY3giw9QmrkGntiA+Srs7OhCIKs9GGo5DfQ=";
32 };
33 freesasa = fetchFromGitHub {
34 owner = "mittinatten";
35 repo = "freesasa";
36 rev = "2.1.1";
37 sha256 = "sha256-fUJvLDTVhpBWl9MavZwp0kAO5Df1QuHEKqe20CXNfcg=";
38 };
39 };
40in
41buildPythonPackage rec {
42 pname = "rdkit";
43 version = "2022.03.5";
44 format = "other";
45
46 src =
47 let
48 versionTag = lib.replaceStrings [ "." ] [ "_" ] version;
49 in
50 fetchFromGitHub {
51 owner = pname;
52 repo = pname;
53 rev = "Release_${versionTag}";
54 sha256 = "19idgilabh04cbr1qj6zgrgsfjm248mmfz6fsr0smrd68d0xnml9";
55 };
56
57 unpackPhase = ''
58 mkdir -p source/External/AvalonTools/avalon source/External/YAeHMOP/yaehmop source/External/FreeSASA/freesasa
59 cp -r ${src}/* source
60 cp -r ${external.avalon}/SourceDistribution/* source/External/AvalonTools/avalon
61 cp -r ${external.yaehmop}/* source/External/YAeHMOP/yaehmop
62 cp -r ${external.freesasa}/* source/External/FreeSASA/freesasa
63
64 find source -type d -exec chmod 755 {} +
65 cp source/External/FreeSASA/freesasa2.c source/External/FreeSASA/freesasa/src
66 ln -s ${rapidjson} source/External/rapidjson-1.1.0
67 '';
68
69 sourceRoot = "source";
70
71 nativeBuildInputs = [
72 cmake
73 git # required by freesasa
74 ];
75
76 buildInputs = [
77 boost
78 catch2
79 inchi
80 eigen
81 cairo
82 rapidjson
83 ];
84
85 propagatedBuildInputs = [
86 numpy
87 pandas
88 pillow
89 ];
90
91 hardeningDisable = [ "format" ]; # required by yaehmop
92
93 dontUseSetuptoolsBuild = true;
94 dontUsePipInstall = true;
95 dontUseSetuptoolsCheck = true;
96
97 preConfigure = ''
98 # Don't want this contacting the git remote during the build
99 substituteInPlace External/YAeHMOP/CMakeLists.txt --replace \
100 'GIT_TAG master' 'DOWNLOAD_COMMAND true'
101
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 "-DCATCH_DIR=${catch2}/include/catch2"
111 "-DINCHI_LIBRARY=${inchi}/lib/libinchi.so"
112 "-DINCHI_LIBRARIES=${inchi}/lib/libinchi.so"
113 "-DINCHI_INCLUDE_DIR=${inchi}/include/inchi"
114 "-DEIGEN3_INCLUDE_DIR=${eigen}/include/eigen3"
115 "-DRDK_INSTALL_INTREE=OFF"
116 "-DRDK_INSTALL_STATIC_LIBS=OFF"
117 "-DRDK_INSTALL_COMIC_FONTS=OFF"
118 "-DRDK_BUILD_INCHI_SUPPORT=ON"
119 "-DRDK_BUILD_AVALON_SUPPORT=ON"
120 "-DRDK_BUILD_FREESASA_SUPPORT=ON"
121 "-DRDK_BUILD_YAEHMOP_SUPPORT=ON"
122 "-DRDK_BUILD_MAEPARSER_SUPPORT=ON"
123 "-DMAEPARSER_DIR=${maeparser}"
124 "-DRDK_BUILD_COORDGEN_SUPPORT=ON"
125 "-DCOORDGEN_DIR=${coordgenlibs}"
126 "-DRDK_USE_URF=OFF"
127 "-DRDK_USE_FLEXBISON=OFF"
128 "-DRDK_BUILD_CAIRO_SUPPORT=ON"
129 "-DRDK_BUILD_THREADSAFE_SSS=ON"
130 "-DRDK_TEST_MULTITHREADED=ON"
131 "-DRDK_BUILD_CPP_TESTS=ON"
132 "-DRDK_TEST_MULTITHREADED=ON"
133 "-DPYTHON_EXECUTABLE=${python}/bin/python"
134 "-DBOOST_ROOT=${boost}"
135 "-DBoost_NO_SYSTEM_PATHS=ON"
136 "-DBoost_NO_BOOST_CMAKE=TRUE"
137 "-DCMAKE_SKIP_BUILD_RPATH=ON" # fails to find libs in pythonImportsCheckPhase otherwise
138 ];
139
140 checkPhase = ''
141 export QT_QPA_PLATFORM='offscreen'
142 export RDBASE=$(realpath ..)
143 export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
144 (cd $RDBASE/rdkit/Chem && python $RDBASE/rdkit/TestRunner.py test_list.py)
145 '';
146
147 pythonImportsCheck = [
148 "rdkit"
149 "rdkit.Chem"
150 "rdkit.Chem.AllChem"
151 ];
152
153 meta = with lib; {
154 description = "Open source toolkit for cheminformatics";
155 maintainers = [ maintainers.rmcgibbo ];
156 license = licenses.bsd3;
157 homepage = "https://www.rdkit.org";
158 };
159}