1{ lib, clangStdenv, clang-sierraHack-stdenv, stdenvNoCC }:
2
3let
4 makeBigExe = stdenv: prefix: rec {
5
6 count = 320;
7
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;
27
28 finalExe = stdenv.mkDerivation {
29 name = "${prefix}-final-asdf";
30 unpackPhase = ''
31 src=$PWD
32 cat << 'EOF' > main.cxx
33
34 #include <cstdlib>
35 #include <iostream>
36
37 ${toString (lib.genList (i: "extern \"C\" unsigned int asdf_${toString i}(void); ") count)}
38
39 unsigned int (*funs[])(void) = {
40 ${toString (lib.genList (i: "asdf_${toString i},") count)}
41 };
42
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 };
66
67 };
68
69 good = makeBigExe clang-sierraHack-stdenv "good";
70
71 bad = makeBigExe clangStdenv "bad";
72
73in 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
82
83 # Must succeed on all supported MacOS versions
84 good-asdf
85 echo "good-asdf should succeed on sierra, OK"
86
87 touch $out
88 '';
89 meta.platforms = lib.platforms.darwin;
90}