summary refs log tree commit diff
path: root/pkgs/servers/foundationdb/cmake.nix
blob: 512842b3a6a232222bc7f1c1c455f4b79d04e096 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# This builder is for FoundationDB CMake build system.

{ lib, fetchFromGitHub
, cmake, ninja, boost, python3, openjdk, mono, libressl

, gccStdenv, llvmPackages
, useClang ? false
, ...
}:

let
  stdenv = if useClang then llvmPackages.libcxxStdenv else gccStdenv;

  tests = with builtins;
    builtins.replaceStrings [ "\n" ] [ " " ] (lib.fileContents ./test-list.txt);

  makeFdb =
    { version
    , branch # unused
    , sha256
    , rev ? "refs/tags/${version}"
    , officialRelease ? true
    , patches ? []
    }: stdenv.mkDerivation {
        pname = "foundationdb";
        inherit version;

        src = fetchFromGitHub {
          owner = "apple";
          repo  = "foundationdb";
          inherit rev sha256;
        };

        buildInputs = [ libressl boost ];
        nativeBuildInputs = [ cmake ninja python3 openjdk mono ]
          ++ lib.optional useClang [ llvmPackages.lld ];

        separateDebugInfo = true;
        enableParallelBuilding = true;
        dontFixCmake = true;

        cmakeFlags =
          [ "-DCMAKE_BUILD_TYPE=Release"
            (lib.optionalString officialRelease "-DFDB_RELEASE=TRUE")

            # FIXME: why can't libressl be found automatically?
            "-DLIBRESSL_USE_STATIC_LIBS=FALSE"
            "-DLIBRESSL_INCLUDE_DIR=${libressl.dev}"
            "-DLIBRESSL_CRYPTO_LIBRARY=${libressl.out}/lib/libcrypto.so"
            "-DLIBRESSL_SSL_LIBRARY=${libressl.out}/lib/libssl.so"
            "-DLIBRESSL_TLS_LIBRARY=${libressl.out}/lib/libtls.so"

            # LTO brings up overall build time, but results in much smaller
            # binaries for all users and the cache.
            (lib.optionalString (!useClang) "-DUSE_LTO=ON")

            # Gold helps alleviate the link time, especially when LTO is
            # enabled. But even then, it still takes a majority of the time.
            # Same with LLD when Clang is available.
            (lib.optionalString useClang    "-DUSE_LD=LLD")
            (lib.optionalString (!useClang) "-DUSE_LD=GOLD")
          ];

        inherit patches;

        # fix up the use of the very weird and custom 'fdb_install' command by just
        # replacing it with cmake's ordinary version.
        postPatch = ''
          for x in bindings/c/CMakeLists.txt fdbserver/CMakeLists.txt fdbmonitor/CMakeLists.txt fdbbackup/CMakeLists.txt fdbcli/CMakeLists.txt; do 
            substituteInPlace $x --replace 'fdb_install' 'install'
          done
        '';

        # the install phase for cmake is pretty wonky right now since it's not designed to
        # coherently install packages as most linux distros expect -- it's designed to build
        # packaged artifacts that are shipped in RPMs, etc. we need to add some extra code to
        # cmake upstream to fix this, and if we do, i think most of this can go away.
        postInstall = ''
          mv $out/sbin/fdbserver $out/bin/fdbserver
          rm -rf \
            $out/lib/systemd $out/Library $out/usr $out/sbin \
            $out/var $out/log $out/etc

          mv $out/fdbmonitor/fdbmonitor $out/bin/fdbmonitor && rm -rf $out/fdbmonitor

          rm -rf $out/lib/foundationdb/
          mkdir $out/libexec && ln -sfv $out/bin/fdbbackup $out/libexec/backup_agent

          mkdir $out/include/foundationdb && \
            mv $out/include/*.h $out/include/*.options $out/include/foundationdb

          # move results into multi outputs
          mkdir -p $dev $lib
          mv $out/include $dev/include
          mv $out/lib $lib/lib

          # python bindings
          # NB: use the original setup.py.in, so we can substitute VERSION correctly
          cp ../LICENSE ./bindings/python
          substitute ../bindings/python/setup.py.in ./bindings/python/setup.py \
            --replace 'VERSION' "${version}"
          rm -f ./bindings/python/setup.py.* ./bindings/python/CMakeLists.txt
          rm -f ./bindings/python/fdb/*.pth # remove useless files
          rm -f ./bindings/python/*.rst ./bindings/python/*.mk

          cp -R ./bindings/python/                          tmp-pythonsrc/
          tar -zcf $pythonsrc --transform s/tmp-pythonsrc/python-foundationdb/ ./tmp-pythonsrc/

          # java bindings
          mkdir -p $lib/share/java
          mv lib/fdb-java-*.jar $lib/share/java/fdb-java.jar

          # include the tests
          mkdir -p $out/share/test
          (cd ../tests && for x in ${tests}; do
            cp --parents $x $out/share/test
          done)
        '';

        outputs = [ "out" "dev" "lib" "pythonsrc" ];

        meta = with stdenv.lib; {
          description = "Open source, distributed, transactional key-value store";
          homepage    = https://www.foundationdb.org;
          license     = licenses.asl20;
          platforms   = [ "x86_64-linux" ];
          maintainers = with maintainers; [ thoughtpolice ];
       };
    };
in makeFdb