Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / test / macos-sierra-shared / default.nix
blob810d5d97829baeb705847a90899b567f05e878e3
1 { lib, clangStdenv, clang-sierraHack-stdenv, stdenvNoCC }:
3 let
4   makeBigExe = stdenv: prefix: rec {
6     count = 320;
8     sillyLibs = lib.genList (i: stdenv.mkDerivation rec {
9       name = "${prefix}-fluff-${toString i}";
10       unpackPhase = ''
11         src=$PWD
12         cat << 'EOF' > ${name}.c
13         unsigned int asdf_${toString i}(void) {
14           return ${toString i};
15         }
16         EOF
17       '';
18       buildPhase = ''
19         $CC -std=c99 -shared ${name}.c -o lib${name}.dylib -Wl,-install_name,$out/lib/lib${name}.dylib
20       '';
21       installPhase = ''
22         mkdir -p "$out/lib"
23         mv lib${name}.dylib "$out/lib"
24       '';
25       meta.platforms = lib.platforms.darwin;
26     }) count;
28     finalExe = stdenv.mkDerivation {
29       name = "${prefix}-final-asdf";
30       unpackPhase = ''
31         src=$PWD
32         cat << 'EOF' > main.cxx
34         #include <cstdlib>
35         #include <iostream>
37         ${toString (lib.genList (i: "extern \"C\" unsigned int asdf_${toString i}(void); ") count)}
39         unsigned int (*funs[])(void) = {
40           ${toString (lib.genList (i: "asdf_${toString i},") count)}
41         };
43         int main(int argc, char **argv) {
44           bool ret;
45           unsigned int i = 0;
46           for (auto f : funs) {
47             if (f() != i++) {
48               std::cerr << "Failed to get expected response from function #" << i << std::endl;
49               return EXIT_FAILURE;
50             }
51           }
52           return EXIT_SUCCESS;
53         }
54         EOF
55       '';
56       buildPhase = ''
57         $CXX -std=c++11 main.cxx ${toString (map (x: "-l${x.name}") sillyLibs)} -o ${prefix}-asdf
58       '';
59       buildInputs = sillyLibs;
60       installPhase = ''
61         mkdir -p "$out/bin"
62         mv ${prefix}-asdf "$out/bin"
63       '';
64       meta.platforms = lib.platforms.darwin;
65     };
67   };
69   good = makeBigExe clang-sierraHack-stdenv "good";
71   bad  = makeBigExe clangStdenv             "bad";
73 in stdenvNoCC.mkDerivation {
74   name = "macos-sierra-shared-test";
75   buildInputs = [ good.finalExe bad.finalExe ];
76   # TODO(@Ericson2314): Be impure or require exact MacOS version of builder?
77   buildCommand = ''
78     if bad-asdf &> /dev/null
79     then echo "WARNING: bad-asdf did not fail, not running on sierra?" >&2
80     else echo "bad-asdf should fail on sierra, OK" >&2
81     fi
83     # Must succeed on all supported MacOS versions
84     good-asdf
85     echo "good-asdf should succeed on sierra, OK"
87     touch $out
88   '';
89   meta.platforms = lib.platforms.darwin;