diff options
Diffstat (limited to 'pkgs/stdenv/darwin/default.nix')
-rw-r--r-- | pkgs/stdenv/darwin/default.nix | 364 |
1 files changed, 107 insertions, 257 deletions
diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index d4b17a7909c7..ac396ecdf12b 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -4,294 +4,144 @@ , config ? {} }: -let - fetch = { file, sha256 }: import <nix/fetchurl.nix> { - url = "https://dl.dropboxusercontent.com/u/2857322/${file}"; - inherit sha256; - executable = true; - }; - - bootstrapFiles = { - sh = fetch { file = "sh"; sha256 = "1qakpg37vl61jnkplz13m3g1csqr85cg8ybp6jwiv6apmg26isnm"; }; - bzip2 = fetch { file = "bzip2"; sha256 = "1gxa67255q9v00j1vn1mzyrnbwys2g1102cx02vpcyvvrl4vqxr0"; }; - mkdir = fetch { file = "mkdir"; sha256 = "1yfl8w65ksji7fggrbvqxw8lp0gm02qilk11n9axj2jxay53ngvg"; }; - cpio = fetch { file = "cpio"; sha256 = "0nssyg19smgcblwq1mfcw4djbd85md84d2f093qcqkbigdjg484b"; }; - }; - tarball = fetch { file = "bootstrap-tools.9.cpio.bz2"; sha256 = "0fd79k7gy3z3sba5w4f4lnrcpiwff31vw02480x1pdry8bbgbf2j"; }; -in rec { +rec { allPackages = import ../../top-level/all-packages.nix; - commonPreHook = '' - export NIX_ENFORCE_PURITY=1 - export NIX_IGNORE_LD_THROUGH_GCC=1 - stripAllFlags=" " # the Darwin "strip" command doesn't know "-s" - export MACOSX_DEPLOYMENT_TARGET=10.7 - export SDKROOT= - export CMAKE_OSX_ARCHITECTURES=x86_64 - ''; - - # libSystem and its transitive dependencies. Get used to this; it's a recurring theme in darwin land - libSystemClosure = [ - "/usr/lib/libSystem.dylib" - "/usr/lib/libSystem.B.dylib" - "/usr/lib/libobjc.A.dylib" - "/usr/lib/libobjc.dylib" - "/usr/lib/libauto.dylib" - "/usr/lib/libc++abi.dylib" - "/usr/lib/libc++.1.dylib" - "/usr/lib/libDiagnosticMessagesClient.dylib" - "/usr/lib/system" - ]; + bootstrapTools = derivation { + inherit system; - # The one dependency of /bin/sh :( - binShClosure = [ "/usr/lib/libncurses.5.4.dylib" ]; + name = "trivial-bootstrap-tools"; + builder = "/bin/sh"; + args = [ ./trivial-bootstrap.sh ]; - bootstrapTools = derivation rec { - inherit system tarball; - - name = "bootstrap-tools"; - builder = bootstrapFiles.sh; # Not a filename! Attribute 'sh' on bootstrapFiles - args = [ ./unpack-bootstrap-tools.sh ]; - - inherit (bootstrapFiles) mkdir bzip2 cpio; - - __impureHostDeps = binShClosure ++ libSystemClosure; + mkdir = "/bin/mkdir"; + ln = "/bin/ln"; }; - stageFun = step: last: {shell ? "${bootstrapTools}/bin/sh", - overrides ? (pkgs: {}), - extraPreHook ? "", - extraBuildInputs ? with last.pkgs; [ xz darwin.CF libcxx ], - extraInitialPath ? [], - allowedRequisites ? null}: - let - thisStdenv = import ../generic { - inherit system config shell extraBuildInputs allowedRequisites; - - name = "stdenv-darwin-boot-${toString step}"; - - cc = if isNull last then "/no-such-path" else import ../../build-support/cc-wrapper { - inherit shell; - inherit (last) stdenv; - inherit (last.pkgs.darwin) dyld; - - nativeTools = true; - nativePrefix = bootstrapTools; - nativeLibc = false; - libc = last.pkgs.darwin.Libsystem; - cc = { name = "clang-9.9.9"; outPath = bootstrapTools; }; - }; - - preHook = stage0.stdenv.lib.optionalString (shell == "${bootstrapTools}/bin/sh") '' - # Don't patch #!/interpreter because it leads to retained - # dependencies on the bootstrapTools in the final stdenv. - dontPatchShebangs=1 - '' + '' - ${commonPreHook} - ${extraPreHook} - ''; - initialPath = extraInitialPath ++ [ bootstrapTools ]; - fetchurlBoot = import ../../build-support/fetchurl { - stdenv = stage0.stdenv; - curl = bootstrapTools; - }; - - # The stdenvs themselves don't use mkDerivation, so I need to specify this here - __stdenvImpureHostDeps = binShClosure ++ libSystemClosure; - __extraImpureHostDeps = binShClosure ++ libSystemClosure; - - extraAttrs = { inherit platform; }; - overrides = pkgs: (overrides pkgs) // { fetchurl = thisStdenv.fetchurlBoot; }; - }; - - thisPkgs = allPackages { - inherit system platform; - bootStdenv = thisStdenv; - }; - in { stdenv = thisStdenv; pkgs = thisPkgs; }; - - stage0 = stageFun 0 null { - overrides = orig: with stage0; rec { - darwin = orig.darwin // { - Libsystem = stdenv.mkDerivation { - name = "bootstrap-Libsystem"; - buildCommand = '' - mkdir -p $out - ln -s ${bootstrapTools}/lib $out/lib - ln -s ${bootstrapTools}/include-Libsystem $out/include - ''; - }; - dyld = bootstrapTools; - }; - - libcxx = stdenv.mkDerivation { - name = "bootstrap-libcxx"; - phases = [ "installPhase" "fixupPhase" ]; - installPhase = '' - mkdir -p $out/lib $out/include - ln -s ${bootstrapTools}/lib/libc++.dylib $out/lib/libc++.dylib - ln -s ${bootstrapTools}/include/c++ $out/include/c++ - ''; - setupHook = ../../development/compilers/llvm/3.5/libc++/setup-hook.sh; - }; - - libcxxabi = stdenv.mkDerivation { - name = "bootstrap-libcxxabi"; - buildCommand = '' - mkdir -p $out/lib - ln -s ${bootstrapTools}/lib/libc++abi.dylib $out/lib/libc++abi.dylib - ''; - }; - + # The simplest stdenv possible to run fetchadc and get the Apple command-line tools + stage0 = rec { + fetchurl = import ../../build-support/fetchurl { + inherit stdenv; + curl = bootstrapTools; }; - extraBuildInputs = []; - }; - - persistent0 = _: {}; - - stage1 = with stage0; stageFun 1 stage0 { - extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\""; - extraBuildInputs = [ pkgs.libcxx ]; - - allowedRequisites = - [ bootstrapTools ] ++ (with pkgs; [ libcxx libcxxabi ]) ++ [ pkgs.darwin.Libsystem ]; - - overrides = persistent0; - }; - - persistent1 = orig: with stage1.pkgs; { - inherit - zlib patchutils m4 scons flex perl bison unifdef unzip openssl icu python - libxml2 gettext sharutils gmp libarchive ncurses pkg-config libedit groff - openssh sqlite sed serf openldap db cyrus-sasl expat apr-util subversion xz - findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils; - - darwin = orig.darwin // { - inherit (darwin) - dyld Libsystem xnu configd libdispatch libclosure launchd; - }; - }; - - stage2 = with stage1; stageFun 2 stage1 { - allowedRequisites = - [ bootstrapTools ] ++ - (with pkgs; [ xz libcxx libcxxabi icu ]) ++ - (with pkgs.darwin; [ dyld Libsystem CF ]); - - overrides = persistent1; - }; - - persistent2 = orig: with stage2.pkgs; { - inherit - patchutils m4 scons flex perl bison unifdef unzip openssl python - gettext sharutils libarchive pkg-config groff bash subversion - openssh sqlite sed serf openldap db cyrus-sasl expat apr-util - findfreetype libssh curl cmake autoconf automake libtool cpio - libcxx libcxxabi; - - darwin = orig.darwin // { - inherit (darwin) - dyld Libsystem xnu configd libdispatch libclosure launchd libiconv; + stdenv = import ../generic { + inherit system config; + name = "stdenv-darwin-boot-0"; + shell = "/bin/bash"; + initialPath = [ bootstrapTools ]; + fetchurlBoot = fetchurl; + cc = "/no-such-path"; }; }; - stage3 = with stage2; stageFun 3 stage2 { - shell = "${pkgs.bash}/bin/bash"; - - # We have a valid shell here (this one has no bootstrap-tools runtime deps) so stageFun - # enables patchShebangs above. Unfortunately, patchShebangs ignores our $SHELL setting - # and instead goes by $PATH, which happens to contain bootstrapTools. So it goes and - # patches our shebangs back to point at bootstrapTools. This makes sure bash comes first. - extraInitialPath = [ pkgs.bash ]; - - allowedRequisites = - [ bootstrapTools ] ++ - (with pkgs; [ icu bash libcxx libcxxabi ]) ++ - (with pkgs.darwin; [ dyld Libsystem ]); - - overrides = persistent2; + buildTools = import ../../os-specific/darwin/command-line-tools { + inherit (stage0) stdenv fetchurl; + xar = bootstrapTools; + gzip = bootstrapTools; + cpio = bootstrapTools; }; - persistent3 = orig: with stage3.pkgs; { - inherit - gnumake gzip gnused bzip2 gawk ed xz patch bash - libcxxabi libcxx ncurses libffi zlib llvm gmp pcre gnugrep - coreutils findutils diffutils patchutils; + preHook = '' + export NIX_IGNORE_LD_THROUGH_GCC=1 + export NIX_DONT_SET_RPATH=1 + export NIX_NO_SELF_RPATH=1 + dontFixLibtool=1 + stripAllFlags=" " # the Darwin "strip" command doesn't know "-s" + xargsFlags=" " + export MACOSX_DEPLOYMENT_TARGET=10.7 + # Use the 10.9 SDK if we're running on 10.9, and 10.10 if we're + # running on 10.10. We need to use the 10.10 headers for functions + # like readlinkat() that are dynamically detected by configure + # scripts. Very impure, obviously. + export SDKROOT=$(/usr/bin/xcrun --sdk macosx"$(/usr/bin/sw_vers -productVersion | /usr/bin/cut -d. -f1,2)" --show-sdk-path 2> /dev/null || echo /) + export NIX_CFLAGS_COMPILE+=" --sysroot=/var/empty -idirafter $SDKROOT/usr/include -F$SDKROOT/System/Library/Frameworks -Wno-multichar -Wno-deprecated-declarations" + export NIX_LDFLAGS_AFTER+=" -L$SDKROOT/usr/lib" + export CMAKE_OSX_ARCHITECTURES=x86_64 + ''; - llvmPackages = orig.llvmPackages // { - inherit (llvmPackages) llvm clang-unwrapped; + # A stdenv that wraps the Apple command-line tools and our other trivial symlinked bootstrap tools + stage1 = rec { + nativePrefix = "${buildTools.tools}/Library/Developer/CommandLineTools/usr"; + + stdenv = import ../generic { + name = "stdenv-darwin-boot-1"; + + inherit system config; + inherit (stage0.stdenv) shell fetchurlBoot; + + initialPath = stage0.stdenv.initialPath ++ [ nativePrefix ]; + + preHook = preHook + "\n" + '' + export NIX_LDFLAGS_AFTER+=" -L/usr/lib" + export NIX_ENFORCE_PURITY= + export NIX_CFLAGS_COMPILE+=" -isystem ${nativePrefix}/include/c++/v1 -stdlib=libc++" + export NIX_CFLAGS_LINK+=" -stdlib=libc++ -Wl,-rpath,${nativePrefix}/lib" + ''; + + cc = import ../../build-support/cc-wrapper { + nativeTools = true; + nativePrefix = nativePrefix; + nativeLibc = true; + stdenv = stage0.stdenv; + shell = "/bin/bash"; + cc = { + name = "clang-9.9.9"; + cc = "/usr"; + outPath = nativePrefix; + }; + isClang = true; + }; }; - - darwin = orig.darwin // { - inherit (darwin) dyld Libsystem libiconv; + pkgs = allPackages { + inherit system platform; + bootStdenv = stdenv; }; }; - stage4 = with stage3; stageFun 4 stage3 { - shell = "${pkgs.bash}/bin/bash"; - extraInitialPath = [ pkgs.bash ]; - overrides = persistent3; - }; + stage2 = rec { + stdenv = import ../generic { + name = "stdenv-darwin-boot-2"; - persistent4 = orig: with stage4.pkgs; { - inherit - gnumake gzip gnused bzip2 gawk ed xz patch bash - libcxxabi libcxx ncurses libffi zlib icu llvm gmp pcre gnugrep - coreutils findutils diffutils patchutils binutils binutils-raw; + inherit system config; + inherit (stage1.stdenv) shell fetchurlBoot preHook cc; - llvmPackages = orig.llvmPackages // { - inherit (llvmPackages) llvm clang-unwrapped; + initialPath = [ stage1.pkgs.xz ] ++ stage1.stdenv.initialPath; }; - - darwin = orig.darwin // { - inherit (darwin) dyld Libsystem cctools CF libiconv; + pkgs = allPackages { + inherit system platform; + bootStdenv = stdenv; }; }; - stage5 = with stage4; import ../generic rec { + # Use stage1 to build a whole set of actual tools so we don't have to rely on the Apple prebuilt ones or + # the ugly symlinked bootstrap tools anymore. + stage3 = with stage2; import ../generic { + name = "stdenv-darwin-boot-3"; + inherit system config; inherit (stdenv) fetchurlBoot; - name = "stdenv-darwin"; - - preHook = commonPreHook; + initialPath = (import ../common-path.nix) { inherit pkgs; }; - __stdenvImpureHostDeps = binShClosure ++ libSystemClosure; - __extraImpureHostDeps = binShClosure ++ libSystemClosure; - - initialPath = import ../common-path.nix { inherit pkgs; }; - shell = "${pkgs.bash}/bin/bash"; + preHook = preHook + "\n" + '' + export NIX_ENFORCE_PURITY=1 + ''; cc = import ../../build-support/cc-wrapper { - inherit stdenv shell; - nativeTools = false; - nativeLibc = false; - inherit (pkgs) coreutils binutils; - inherit (pkgs.darwin) dyld; - cc = pkgs.llvmPackages.clang-unwrapped; - libc = pkgs.darwin.Libsystem; - }; - - extraBuildInputs = with pkgs; [ darwin.CF libcxx ]; - - extraAttrs = { - inherit platform bootstrapTools; - libc = pkgs.darwin.Libsystem; - shellPackage = pkgs.bash; + inherit stdenv; + nativeTools = false; + nativeLibc = true; + binutils = pkgs.darwin.cctools; + cc = pkgs.llvmPackages.clang-unwrapped; + coreutils = pkgs.coreutils; + shell = "${pkgs.bash}/bin/bash"; + extraPackages = [ pkgs.libcxx ]; + isClang = true; }; - allowedRequisites = (with pkgs; [ - xz libcxx libcxxabi icu gmp gnumake findutils bzip2 llvm zlib libffi - coreutils ed diffutils gnutar gzip ncurses gnused bash gawk - gnugrep llvmPackages.clang-unwrapped patch pcre binutils-raw binutils gettext - ]) ++ (with pkgs.darwin; [ - dyld Libsystem CF cctools libiconv - ]); - - overrides = orig: persistent4 orig // { - clang = cc; - inherit cc; - }; + shell = "${pkgs.bash}/bin/bash"; }; + + stdenvDarwin = stage3; } |