Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
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}