diff options
Diffstat (limited to 'pkgs/os-specific/darwin')
5 files changed, 129 insertions, 55 deletions
diff --git a/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix b/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix index 518ab4230156f..238c1b7e460b0 100644 --- a/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix +++ b/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix @@ -105,6 +105,8 @@ let # conflicting LLVM modules. objc4 = stdenv.objc4 or (callPackage ./libobjc.nix { }); + sdkRoot = pkgs.callPackage ../apple-sdk/sdkRoot.nix { sdkVersion = "11.0"; }; + # questionable aliases configd = pkgs.darwin.apple_sdk.frameworks.SystemConfiguration; inherit (pkgs.darwin.apple_sdk.frameworks) IOKit; diff --git a/pkgs/os-specific/darwin/apple-sdk/default.nix b/pkgs/os-specific/darwin/apple-sdk/default.nix index 962f7f681c49d..a3d1df0867a9a 100644 --- a/pkgs/os-specific/darwin/apple-sdk/default.nix +++ b/pkgs/os-specific/darwin/apple-sdk/default.nix @@ -352,5 +352,11 @@ in rec { inherit darwin-stubs; + objc4 = pkgs.darwin.libobjc; + + sdkRoot = pkgs.callPackage ./sdkRoot.nix { sdkVersion = "10.12"; }; + + inherit (pkgs.darwin) Libsystem; + inherit sdk; } diff --git a/pkgs/os-specific/darwin/apple-sdk/sdkRoot.nix b/pkgs/os-specific/darwin/apple-sdk/sdkRoot.nix new file mode 100644 index 0000000000000..67d9cbe031059 --- /dev/null +++ b/pkgs/os-specific/darwin/apple-sdk/sdkRoot.nix @@ -0,0 +1,68 @@ +{ + lib, + runCommand, + writeText, + sdkVersion, +}: + +let + sdkName = "MacOSX${sdkVersion}"; + toolchainName = "com.apple.dt.toolchain.XcodeDefault"; + productBuildVer = null; + + inherit (lib.generators) toPlist toJSON; + + SDKSettings = { + CanonicalName = "macosx${sdkVersion}"; + DisplayName = "macOS ${sdkVersion}"; + Toolchains = [ toolchainName ]; + Version = sdkVersion; + MaximumDeploymentTarget = "${sdkVersion}.99"; + isBaseSDK = "YES"; + }; + + SystemVersion = + lib.optionalAttrs (productBuildVer != null) { ProductBuildVersion = productBuildVer; } + // { + ProductName = "macOS"; + ProductVersion = sdkVersion; + }; +in +runCommand "sdkroot-${sdkVersion}" { } '' + sdk="$out/${sdkName}.sdk" + + install -D ${writeText "SDKSettings.plist" (toPlist { } SDKSettings)} "$sdk/SDKSettings.plist" + install -D ${writeText "SDKSettings.json" (toJSON { } SDKSettings)} "$sdk/SDKSettings.json" + install -D ${ + writeText "SystemVersion.plist" (toPlist { } SystemVersion) + } "$sdk/System/Library/CoreServices/SystemVersion.plist" + + ln -s "$sdk" "$sdk/usr" + + install -D '${../../../build-support/setup-hooks/role.bash}' "$out/nix-support/setup-hook" + cat >> "$out/nix-support/setup-hook" <<-hook + # + # See comments in cc-wrapper's setup hook. This works exactly the same way. + # + [[ -z \''${strictDeps-} ]] || (( "\$hostOffset" < 0 )) || return 0 + + sdkRootHook() { + # See ../../../build-support/setup-hooks/role.bash + local role_post + getHostRoleEnvHook + + # Only set the SDK root if one has not been set via this hook or some other means. + if [[ ! \$NIX_CFLAGS_COMPILE =~ isysroot ]]; then + export NIX_CFLAGS_COMPILE\''${role_post}+=' -isysroot $out/${sdkName}.sdk' + fi + } + + # See ../../../build-support/setup-hooks/role.bash + getTargetRole + + addEnvHooks "\$targetOffset" sdkRootHook + + # No local scope in sourced file + unset -v role_post + hook +'' diff --git a/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix b/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix index c9cc99a6550e7..cea921488c0fb 100644 --- a/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix +++ b/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix @@ -10,24 +10,13 @@ let darling.src = fetchzip { url = "https://github.com/darlinghq/darling/archive/d2cc5fa748003aaa70ad4180fff0a9a85dc65e9b.tar.gz"; - sha256 = "11b51fw47nl505h63bgx5kqiyhf3glhp1q6jkpb6nqfislnzzkrf"; + hash = "sha256-/YynrKJdi26Xj4lvp5wsN+TAhZjonOrNNHuk4L5tC7s="; postFetch = '' - # The archive contains both `src/opendirectory` and `src/OpenDirectory`, - # pre-create the directory to choose the canonical case on - # case-insensitive filesystems. - mkdir -p $out/src/OpenDirectory - - cd $out - tar -xzf $downloadedFile --strip-components=1 - rm -r $out/src/libm - - # If `src/opendirectory` and `src/OpenDirectory` refer to different - # things, then combine them into `src/OpenDirectory` to match the result - # on case-insensitive filesystems. - if [ "$(stat -c %i src/opendirectory)" != "$(stat -c %i src/OpenDirectory)" ]; then - mv src/opendirectory/* src/OpenDirectory/ - rmdir src/opendirectory - fi + # The archive contains both `src/opendirectory` and `src/OpenDirectory`. + # Since neither directory is used for anything, we just remove them to avoid + # the potential issue where file systems with different case sensitivity produce + # different hashes. + rm -rf $out/src/{OpenDirectory,opendirectory} ''; }; diff --git a/pkgs/os-specific/darwin/binutils/default.nix b/pkgs/os-specific/darwin/binutils/default.nix index d7bdac6ceea34..78c510f7da4cd 100644 --- a/pkgs/os-specific/darwin/binutils/default.nix +++ b/pkgs/os-specific/darwin/binutils/default.nix @@ -11,6 +11,7 @@ let "ld" "strip" "otool" "lipo" "nm" "strings" "size" "codesign_allocate" ]; + isCCToolsLLVM = lib.getName cctools == "cctools-llvm"; in # TODO: loop over targetPrefixed binaries too @@ -33,7 +34,7 @@ stdenv.mkDerivation { # - strip: the binutils one seems to break mach-o files # - lipo: gcc build assumes it exists # - nm: the gnu one doesn't understand many new load commands - for i in ${lib.concatStringsSep " " (builtins.map (e: targetPrefix + e) cmds)}; do + for i in ${lib.concatStringsSep " " (map (e: targetPrefix + e) cmds)}; do ln -sf "${cctools}/bin/$i" "$out/bin/$i" done @@ -41,51 +42,59 @@ stdenv.mkDerivation { ln -s ${binutils-unwrapped.out}/share $out/share - ln -s ${cctools}/libexec $out/libexec - mkdir -p "$man"/share/man/man{1,5} - for i in ${builtins.concatStringsSep " " cmds}; do + for i in ${lib.concatStringsSep " " cmds}; do for path in "${cctools.man}"/share/man/man?/$i.*; do dest_path="$man''${path#${cctools.man}}" ln -sv "$path" "$dest_path" done done '' - # On aarch64-darwin we must use clang, because "as" from cctools just doesn't - # handle the arch. Proxying calls to clang produces quite a bit of warnings, - # and using clang directly here is a better option than relying on cctools. - # On x86_64-darwin the Clang version is too old to support this mode. - + lib.optionalString stdenv.isAarch64 '' - rm $out/bin/${targetPrefix}as - makeWrapper "${clang-unwrapped}/bin/clang" "$out/bin/${targetPrefix}as" \ - --add-flags "-x assembler -integrated-as -c" - '' - # x86-64 Darwin gnat-bootstrap emits assembly - # with MOVQ as the mnemonic for quadword interunit moves - # such as `movq %rbp, %xmm0`. - # The clang integrated assembler recognises this as valid, - # but unfortunately the cctools-port GNU assembler does not; - # it instead uses MOVD as the mnemonic. - # The assembly that a GCC build emits is determined at build time - # and cannot be changed afterwards. - # - # To build GNAT on x86-64 Darwin, therefore, - # we need both the clang _and_ the cctools-port assemblers to be available: - # the former to build at least the stage1 compiler, - # and the latter at least to be detectable - # as the target for the final compiler. - # - # We choose to match the Aarch64 case above, - # wrapping the clang integrated assembler as `as`. - # It then seems sensible to wrap the cctools GNU assembler as `gas`. - # - + lib.optionalString (stdenv.isx86_64 && dualAs) '' - mv $out/bin/${targetPrefix}as $out/bin/${targetPrefix}gas - makeWrapper "${clang-unwrapped}/bin/clang" "$out/bin/${targetPrefix}as" \ - --add-flags "-x assembler -integrated-as -c" - ''; + + lib.optionalString (!isCCToolsLLVM) ( + # cctools-port has a `libexec` folder for `as`, but cctools-llvm uses the clang + # assembler on both platforms. Only link it when cctools is cctools-port. + '' + ln -s ${cctools}/libexec $out/libexec + '' + # cctools-llvm uses the LLVM assembler on both architectures, so use the assembler + # from that instead of relinking it. + # + # On aarch64-darwin we must use clang, because "as" from cctools just doesn't + # handle the arch. Proxying calls to clang produces quite a bit of warnings, + # and using clang directly here is a better option than relying on cctools. + # On x86_64-darwin the Clang version is too old to support this mode. + + lib.optionalString stdenv.isAarch64 '' + rm $out/bin/${targetPrefix}as + makeWrapper "${clang-unwrapped}/bin/clang" "$out/bin/${targetPrefix}as" \ + --add-flags "-x assembler -integrated-as -c" + '' + # x86-64 Darwin gnat-bootstrap emits assembly + # with MOVQ as the mnemonic for quadword interunit moves + # such as `movq %rbp, %xmm0`. + # The clang integrated assembler recognises this as valid, + # but unfortunately the cctools-port GNU assembler does not; + # it instead uses MOVD as the mnemonic. + # The assembly that a GCC build emits is determined at build time + # and cannot be changed afterwards. + # + # To build GNAT on x86-64 Darwin, therefore, + # we need both the clang _and_ the cctools-port assemblers to be available: + # the former to build at least the stage1 compiler, + # and the latter at least to be detectable + # as the target for the final compiler. + # + # We choose to match the Aarch64 case above, + # wrapping the clang integrated assembler as `as`. + # It then seems sensible to wrap the cctools GNU assembler as `gas`. + # + + lib.optionalString (stdenv.isx86_64 && dualAs) '' + mv $out/bin/${targetPrefix}as $out/bin/${targetPrefix}gas + makeWrapper "${clang-unwrapped}/bin/clang" "$out/bin/${targetPrefix}as" \ + --add-flags "-x assembler -integrated-as -c" + '' + ); - nativeBuildInputs = lib.optionals (stdenv.isAarch64 || dualAs) [ makeWrapper ]; + nativeBuildInputs = lib.optionals (!isCCToolsLLVM && (stdenv.isAarch64 || dualAs)) [ makeWrapper ]; passthru = { inherit targetPrefix; |