1{
2 lib,
3 stdenv,
4 fetchurl,
5 python311Packages,
6 makeWrapper,
7 gawk,
8 bash,
9 getopt,
10 procps,
11 which,
12 jre,
13 nixosTests,
14 # generation is the attribute version suffix such as 4 in pkgs.cassandra_4
15 generation,
16 version,
17 sha256,
18 extraMeta ? { },
19 callPackage,
20 ...
21}:
22
23let
24 libPath = lib.makeLibraryPath [ stdenv.cc.cc ];
25 binPath = lib.makeBinPath [
26 bash
27 getopt
28 gawk
29 which
30 jre
31 procps
32 ];
33in
34
35stdenv.mkDerivation rec {
36 pname = "cassandra";
37 inherit version;
38
39 src = fetchurl {
40 inherit sha256;
41 url = "mirror://apache/cassandra/${version}/apache-cassandra-${version}-bin.tar.gz";
42 };
43
44 pythonPath = with python311Packages; [ cassandra-driver ];
45
46 nativeBuildInputs = [ python311Packages.wrapPython ];
47
48 buildInputs = [ python311Packages.python ] ++ pythonPath;
49
50 installPhase = ''
51 runHook preInstall
52
53 mkdir $out
54 mv * $out
55
56 # Clean up documentation.
57 mkdir -p $out/share/doc/${pname}-${version}
58 mv $out/CHANGES.txt \
59 $out/LICENSE.txt \
60 $out/NEWS.txt \
61 $out/NOTICE.txt \
62 $out/share/doc/${pname}-${version}
63
64 if [[ -d $out/doc ]]; then
65 mv "$out/doc/"* $out/share/doc/${pname}-${version}
66 rmdir $out/doc
67 fi
68
69
70 for cmd in bin/cassandra \
71 bin/nodetool \
72 bin/sstablekeys \
73 bin/sstableloader \
74 bin/sstablescrub \
75 bin/sstableupgrade \
76 bin/sstableutil \
77 bin/sstableverify; do
78 # Check if file exists because some don't exist across all versions
79 if [ -f $out/$cmd ]; then
80 wrapProgram $out/bin/$(basename "$cmd") \
81 --suffix-each LD_LIBRARY_PATH : ${libPath} \
82 --prefix PATH : ${binPath} \
83 --set JAVA_HOME ${jre}
84 fi
85 done
86
87 for cmd in tools/bin/cassandra-stress \
88 tools/bin/cassandra-stressd \
89 tools/bin/sstabledump \
90 tools/bin/sstableexpiredblockers \
91 tools/bin/sstablelevelreset \
92 tools/bin/sstablemetadata \
93 tools/bin/sstableofflinerelevel \
94 tools/bin/sstablerepairedset \
95 tools/bin/sstablesplit \
96 tools/bin/token-generator; do
97 # Check if file exists because some don't exist across all versions
98 if [ -f $out/$cmd ]; then
99 makeWrapper $out/$cmd $out/bin/$(basename "$cmd") \
100 --suffix-each LD_LIBRARY_PATH : ${libPath} \
101 --prefix PATH : ${binPath} \
102 --set JAVA_HOME ${jre}
103 fi
104 done
105
106 runHook postInstall
107 '';
108
109 postFixup = ''
110 # Remove cassandra bash script wrapper.
111 # The wrapper searches for a suitable python version and is not necessary with Nix.
112 rm $out/bin/cqlsh
113 # Make "cqlsh.py" accessible by invoking "cqlsh"
114 ln -s $out/bin/cqlsh.py $out/bin/cqlsh
115 wrapPythonPrograms
116 '';
117
118 passthru = {
119 tests =
120 let
121 test = nixosTests."cassandra_${generation}";
122 in
123 {
124 nixos =
125 assert test.testPackage.version == version;
126 test;
127 };
128
129 updateScript = callPackage ./update-script.nix { inherit generation; };
130 };
131
132 meta =
133 with lib;
134 {
135 homepage = "https://cassandra.apache.org/";
136 description = "Massively scalable open source NoSQL database";
137 platforms = platforms.unix;
138 license = licenses.asl20;
139 sourceProvenance = with sourceTypes; [
140 binaryBytecode
141 binaryNativeCode # bundled dependency libsigar
142 ];
143 maintainers = [ maintainers.roberth ];
144 }
145 // extraMeta;
146}