about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/xcbuild
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/tools/xcbuild')
-rw-r--r--nixpkgs/pkgs/development/tools/xcbuild/default.nix72
-rw-r--r--nixpkgs/pkgs/development/tools/xcbuild/platforms.nix301
-rw-r--r--nixpkgs/pkgs/development/tools/xcbuild/sdks.nix29
-rw-r--r--nixpkgs/pkgs/development/tools/xcbuild/setup-hook.sh29
-rw-r--r--nixpkgs/pkgs/development/tools/xcbuild/toolchains.nix73
-rw-r--r--nixpkgs/pkgs/development/tools/xcbuild/wrapper.nix142
6 files changed, 646 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/xcbuild/default.nix b/nixpkgs/pkgs/development/tools/xcbuild/default.nix
new file mode 100644
index 000000000000..cb2e6edd0e10
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/xcbuild/default.nix
@@ -0,0 +1,72 @@
+{ stdenv, cmake, fetchFromGitHub, zlib, libxml2, libpng
+, CoreServices, CoreGraphics, ImageIO, ninja }:
+
+let
+  googletest = fetchFromGitHub {
+    owner  = "google";
+    repo   = "googletest";
+    rev    = "43359642a1c16ad3f4fc575c7edd0cb935810815";
+    sha256 = "0y4xaah62fjr3isaryc3vfz3mn9xflr00vchdimj8785milxga4q";
+  };
+
+  linenoise = fetchFromGitHub {
+    owner  = "antirez";
+    repo   = "linenoise";
+    rev    = "c894b9e59f02203dbe4e2be657572cf88c4230c3";
+    sha256 = "0wasql7ph5g473zxhc2z47z3pjp42q0dsn4gpijwzbxawid71b4w";
+  };
+in stdenv.mkDerivation {
+  pname = "xcbuild";
+
+  # Once a version is released that includes
+  # https://github.com/facebook/xcbuild/commit/183c087a6484ceaae860c6f7300caf50aea0d710,
+  # we can stop doing this -pre thing.
+  version = "0.1.2-pre";
+
+  src = fetchFromGitHub {
+    owner  = "facebook";
+    repo   = "xcbuild";
+    rev    = "32b9fbeb69bfa2682bd0351ec2f14548aaedd554";
+    sha256 = "1xxwg2849jizxv0g1hy0b1m3i7iivp9bmc4f5pi76swsn423d41m";
+  };
+
+  prePatch = ''
+    rmdir ThirdParty/*
+    cp -r --no-preserve=all ${googletest} ThirdParty/googletest
+    cp -r --no-preserve=all ${linenoise} ThirdParty/linenoise
+  '';
+
+  postPatch = stdenv.lib.optionalString (!stdenv.isDarwin) ''
+    # Avoid a glibc >= 2.25 deprecation warning that gets fatal via -Werror.
+    sed 1i'#include <sys/sysmacros.h>' \
+      -i Libraries/xcassets/Headers/xcassets/Slot/SystemVersion.h
+  '' + stdenv.lib.optionalString stdenv.isDarwin ''
+    # Apple Open Sourced LZFSE, but not libcompression, and it isn't
+    # part of an impure framework we can add
+    substituteInPlace Libraries/libcar/Sources/Rendition.cpp \
+      --replace "#if HAVE_LIBCOMPRESSION" "#if 0"
+  '';
+
+  enableParallelBuilding = true;
+
+  # TODO: instruct cmake not to put it in /usr, rather than cleaning up
+  postInstall = ''
+    mv $out/usr/* $out
+    rmdir $out/usr
+  '';
+
+  NIX_CFLAGS_COMPILE = "-Wno-error";
+
+  cmakeFlags = [ "-GNinja" ];
+
+  buildInputs = [ cmake zlib libxml2 libpng ninja ]
+    ++ stdenv.lib.optionals stdenv.isDarwin [ CoreServices CoreGraphics ImageIO ];
+
+  meta = with stdenv.lib; {
+    description = "Xcode-compatible build tool";
+    homepage = "https://github.com/facebook/xcbuild";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ copumpkin matthewbauer ];
+    license = with licenses; [ bsd2 bsd3 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/tools/xcbuild/platforms.nix b/nixpkgs/pkgs/development/tools/xcbuild/platforms.nix
new file mode 100644
index 000000000000..e20dc878b535
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/xcbuild/platforms.nix
@@ -0,0 +1,301 @@
+{ runCommand, lib, sdks, xcodePlatform, writeText }:
+
+let
+
+  inherit (lib.generators) toPlist;
+
+  Info = {
+    CFBundleIdentifier = "com.apple.platform.${lib.toLower xcodePlatform}";
+    Type = "Platform";
+    Name = lib.toLower xcodePlatform;
+  };
+
+  Version = {
+    ProjectName = "OSXPlatformSupport";
+  };
+
+  # These files are all based off of Xcode spec fies found in
+  # /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Speciications/.
+
+  # Based off of the MacOSX Architectures.xcpsec file. All i386 stuff
+  # is removed because NixPkgs only supports darwin-x86_64.
+  Architectures = [
+    {
+      Identifier = "Standard";
+      Type = "Architecture";
+      Name = "Standard Architectures (64-bit Intel)";
+      RealArchitectures = [ "x86_64" ];
+      ArchitectureSetting = "ARCHS_STANDARD";
+    }
+    {
+      Identifier = "Universal";
+      Type = "Architecture";
+      Name = "Universal (64-bit Intel)";
+      RealArchitectures = [ "x86_64" ];
+      ArchitectureSetting = "ARCHS_STANDARD_32_64_BIT";
+    }
+    {
+      Identifier = "Native";
+      Type = "Architecture";
+      Name = "Native Architecture of Build Machine";
+      ArchitectureSetting = "NATIVE_ARCH_ACTUAL";
+    }
+    {
+      Identifier = "Standard64bit";
+      Type = "Architecture";
+      Name = "64-bit Intel";
+      RealArchitectures = [ "x86_64" ];
+      ArchitectureSetting = "ARCHS_STANDARD_64_BIT";
+    }
+    {
+      Identifier = "x86_64";
+      Type = "Architecture";
+      Name = "Intel 64-bit";
+    }
+    {
+      Identifier = "Standard_Including_64_bit";
+      Type = "Architecture";
+      Name = "Standard Architectures (including 64-bit)";
+      RealArchitectures = [ "x86_64" ];
+      ArchitectureSetting = "ARCHS_STANDARD_INCLUDING_64_BIT";
+    }
+  ];
+
+  # Based off of the MacOSX Package Types.xcpsec file. Only keep the
+  # bare minimum needed.
+  PackageTypes = [
+    {
+      Identifier = "com.apple.package-type.mach-o-executable";
+      Type = "PackageType";
+      Name = "Mach-O Executable";
+      DefaultBuildSettings = {
+        EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
+        EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
+      };
+      ProductReference = {
+        FileType = "compiled.mach-o.executable";
+        Name = "$(EXECUTABLE_NAME)";
+      };
+    }
+    {
+      Identifier = "com.apple.package-type.mach-o-objfile";
+      Type = "PackageType";
+      Name = "Mach-O Object File";
+      DefaultBuildSettings = {
+        EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
+        EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
+      };
+      ProductReference = {
+        FileType = "compiled.mach-o.objfile";
+        Name = "$(EXECUTABLE_NAME)";
+      };
+    }
+    {
+      Identifier = "com.apple.package-type.mach-o-dylib";
+      Type = "PackageType";
+      Name = "Mach-O Dynamic Library";
+      DefaultBuildSettings = {
+        EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
+        EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
+      };
+      ProductReference = {
+        FileType = "compiled.mach-o.dylib";
+        Name = "$(EXECUTABLE_NAME)";
+      };
+    }
+    {
+      Identifier = "com.apple.package-type.static-library";
+      Type = "PackageType";
+      Name = "Mach-O Static Library";
+      DefaultBuildSettings = {
+        EXECUTABLE_PREFIX = "lib";
+        EXECUTABLE_SUFFIX = ".a";
+        EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
+        EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
+      };
+      ProductReference = {
+        FileType = "archive.ar";
+        Name = "$(EXECUTABLE_NAME)";
+        IsLaunchable = "NO";
+      };
+    }
+    {
+      Identifier = "com.apple.package-type.wrapper";
+      Type = "PackageType";
+      Name = "Wrapper";
+      DefaultBuildSettings = {
+        WRAPPER_SUFFIX = ".bundle";
+        WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)";
+        CONTENTS_FOLDER_PATH = "$(WRAPPER_NAME)/Contents";
+        EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
+        EXECUTABLE_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/MacOS";
+        EXECUTABLE_PATH = "$(EXECUTABLE_FOLDER_PATH)/$(EXECUTABLE_NAME)";
+        INFOPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/Info.plist";
+        INFOSTRINGS_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/InfoPlist.strings";
+        PKGINFO_PATH = "$(CONTENTS_FOLDER_PATH)/PkgInfo";
+        PBDEVELOPMENTPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/pbdevelopment.plist";
+        VERSIONPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/version.plist";
+        PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers";
+        PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders";
+        EXECUTABLES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Executables";
+        FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Frameworks";
+        SHARED_FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedFrameworks";
+        SHARED_SUPPORT_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedSupport";
+        UNLOCALIZED_RESOURCES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Resources";
+        LOCALIZED_RESOURCES_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/$(DEVELOPMENT_LANGUAGE).lproj";
+        DOCUMENTATION_FOLDER_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/Documentation";
+        PLUGINS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PlugIns";
+        SCRIPTS_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/Scripts";
+      };
+      ProductReference = {
+        FileType = "wrapper.cfbundle";
+        Name = "$(WRAPPER_NAME)";
+        IsLaunchable = "NO";
+      };
+    }
+    {
+      Identifier = "com.apple.package-type.wrapper.application";
+      Type = "PackageType";
+      BasedOn = "com.apple.package-type.wrapper";
+      Name = "Application Wrapper";
+      DefaultBuildSettings = {
+        GENERATE_PKGINFO_FILE = "YES";
+      };
+      ProductReference = {
+        FileType = "wrapper.application";
+        Name = "$(WRAPPER_NAME)";
+        IsLaunchable = "YES";
+      };
+    }
+  ];
+
+  # Based off of the MacOSX Product Types.xcpsec file. All
+  # bundles/wrapper are removed, because we prefer dynamic products in
+  # NixPkgs.
+  ProductTypes = [
+    {
+      Identifier = "com.apple.product-type.tool";
+      Type = "ProductType";
+      Name = "Command-line Tool";
+      PackageTypes = [ "com.apple.package-type.mach-o-executable" ];
+    }
+    {
+      Identifier = "com.apple.product-type.objfile";
+      Type = "ProductType";
+      Name = "Object File";
+      PackageTypes = [ "com.apple.package-type.mach-o-objfile" ];
+    }
+    {
+      Identifier = "com.apple.product-type.library.dynamic";
+      Type = "ProductType";
+      Name = "Dynamic Library";
+      PackageTypes = [ "com.apple.package-type.mach-o-dylib" ];
+      DefaultBuildProperties = {
+        FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)";
+        MACH_O_TYPE = "mh_dylib";
+        REZ_EXECUTABLE = "YES";
+        EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)";
+        EXECUTABLE_EXTENSION = "dylib";
+        DYLIB_COMPATIBILITY_VERSION = "1";
+        DYLIB_CURRENT_VERSION = "1";
+        FRAMEWORK_FLAG_PREFIX = "-framework";
+        LIBRARY_FLAG_PREFIX = "-l";
+        LIBRARY_FLAG_NOSPACE = "YES";
+        STRIP_STYLE = "debugging";
+        GCC_INLINES_ARE_PRIVATE_EXTERN = "YES";
+        CODE_SIGNING_ALLOWED = "YES";
+        CODE_SIGNING_REQUIRED = "NO";
+      };
+    }
+    {
+      Identifier = "com.apple.product-type.library.static";
+      Type = "ProductType";
+      Name = "Static Library";
+      PackageTypes = [ "com.apple.package-type.static-library" ];
+      DefaultBuildProperties = {
+        FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)";
+        MACH_O_TYPE = "staticlib";
+        REZ_EXECUTABLE = "YES";
+        EXECUTABLE_PREFIX = "lib";
+        EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)";
+        EXECUTABLE_EXTENSION = "a";
+        FRAMEWORK_FLAG_PREFIX = "-framework";
+        LIBRARY_FLAG_PREFIX = "-l";
+        LIBRARY_FLAG_NOSPACE = "YES";
+        STRIP_STYLE = "debugging";
+        SEPARATE_STRIP = "YES";
+        CLANG_ENABLE_MODULE_DEBUGGING = "NO";
+      };
+    }
+    {
+      Type = "ProductType";
+      Identifier = "com.apple.product-type.bundle";
+      Name = "Bundle";
+      DefaultBuildProperties = {
+        FULL_PRODUCT_NAME = "$(WRAPPER_NAME)";
+        MACH_O_TYPE = "mh_bundle";
+        WRAPPER_PREFIX = "";
+        WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)";
+        WRAPPER_EXTENSION = "bundle";
+        WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)";
+        FRAMEWORK_FLAG_PREFIX = "-framework";
+        LIBRARY_FLAG_PREFIX = "-l";
+        LIBRARY_FLAG_NOSPACE = "YES";
+        STRIP_STYLE = "non-global";
+      };
+      PackageTypes = [ "com.apple.package-type.wrapper" ];
+      IsWrapper = "YES";
+      HasInfoPlist = "YES";
+      HasInfoPlistStrings = "YES";
+    }
+    {
+      Identifier = "com.apple.product-type.application";
+      Type = "ProductType";
+      BasedOn = "com.apple.product-type.bundle";
+      Name = "Application";
+      DefaultBuildProperties = {
+        MACH_O_TYPE = "mh_execute";
+        WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)";
+        WRAPPER_EXTENSION = "app";
+      };
+      PackageTypes = [ "com.apple.package-type.wrapper.application" ];
+    }
+    {
+      Type = "ProductType";
+      Identifier = "com.apple.product-type.framework";
+      Name = "Bundle";
+      DefaultBuildProperties = {
+        FULL_PRODUCT_NAME = "$(WRAPPER_NAME)";
+        MACH_O_TYPE = "mh_bundle";
+        WRAPPER_PREFIX = "";
+        WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)";
+        WRAPPER_EXTENSION = "bundle";
+        WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)";
+        FRAMEWORK_FLAG_PREFIX = "-framework";
+        LIBRARY_FLAG_PREFIX = "-l";
+        LIBRARY_FLAG_NOSPACE = "YES";
+        STRIP_STYLE = "non-global";
+      };
+      PackageTypes = [ "com.apple.package-type.wrapper" ];
+      IsWrapper = "YES";
+      HasInfoPlist = "YES";
+      HasInfoPlistStrings = "YES";
+    }
+  ];
+
+in
+
+runCommand "Platforms" {} ''
+  platform=$out/${xcodePlatform}.platform
+
+  install -D ${writeText "Info.plist" (toPlist {} Info)} $platform/Info.plist
+  install -D ${writeText "version.plist" (toPlist {} Version)} $platform/version.plist
+  install -D ${writeText "Architectures.xcspec" (toPlist {} Architectures)} $platform/Developer/Library/Xcode/Specifications/Architectures.xcspec
+  install -D ${writeText "PackageTypes.xcspec" (toPlist {} PackageTypes)} $platform/Developer/Library/Xcode/Specifications/PackageTypes.xcspec
+  install -D ${writeText "ProductTypes.xcspec" (toPlist {} ProductTypes)} $platform/Developer/Library/Xcode/Specifications/ProductTypes.xcspec
+
+  ln -s $platform $platform/usr
+
+  mkdir -p $platform/Developer
+  ln -s ${sdks} $platform/Developer/SDKs
+''
diff --git a/nixpkgs/pkgs/development/tools/xcbuild/sdks.nix b/nixpkgs/pkgs/development/tools/xcbuild/sdks.nix
new file mode 100644
index 000000000000..5ff3ca6808dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/xcbuild/sdks.nix
@@ -0,0 +1,29 @@
+{ runCommand, lib, toolchainName, sdkName
+, writeText, version, xcodePlatform }:
+
+let
+  inherit (lib.generators) toPlist;
+
+  SDKSettings = {
+    CanonicalName = sdkName;
+    DisplayName = sdkName;
+    Toolchains = [ toolchainName ];
+    Version = version;
+    MaximumDeploymentTarget = version;
+    isBaseSDK = "YES";
+  };
+
+  SystemVersion = {
+    ProductName = "Mac OS X";
+    ProductVersion = version;
+  };
+in
+
+runCommand "SDKs" {} ''
+  sdk=$out/${sdkName}.sdk
+  install -D ${writeText "SDKSettings.plist" (toPlist {} SDKSettings)} $sdk/SDKSettings.plist
+  install -D ${writeText "SystemVersion.plist" (toPlist {} SystemVersion)} $sdk/System/Library/CoreServices/SystemVersion.plist
+  ln -s $sdk $sdk/usr
+
+  ln -s $sdk $out/${xcodePlatform}.sdk
+''
diff --git a/nixpkgs/pkgs/development/tools/xcbuild/setup-hook.sh b/nixpkgs/pkgs/development/tools/xcbuild/setup-hook.sh
new file mode 100644
index 000000000000..f4b5abf2d8d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/xcbuild/setup-hook.sh
@@ -0,0 +1,29 @@
+xcbuildBuildPhase() {
+    export DSTROOT=$out
+
+    runHook preBuild
+
+    echo "running xcodebuild"
+
+    xcodebuild SYMROOT=$PWD/Products OBJROOT=$PWD/Intermediates $xcbuildFlags build
+
+    runHook postBuild
+}
+
+xcbuildInstallPhase () {
+    runHook preInstall
+
+    # not implemented
+    # xcodebuild install
+
+    runHook postInstall
+}
+
+buildPhase=xcbuildBuildPhase
+if [ -z "${installPhase-}" ]; then
+    installPhase=xcbuildInstallPhase
+fi
+
+# if [ -d "*.xcodeproj" ]; then
+#     buildPhase=xcbuildPhase
+# fi
diff --git a/nixpkgs/pkgs/development/tools/xcbuild/toolchains.nix b/nixpkgs/pkgs/development/tools/xcbuild/toolchains.nix
new file mode 100644
index 000000000000..e435f0978c5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/xcbuild/toolchains.nix
@@ -0,0 +1,73 @@
+{ runCommand, toolchainName, fetchurl, stdenv
+, buildPackages, lib, writeText }:
+
+let
+
+  inherit (lib) getBin optionalString;
+  inherit (lib.generators) toPlist;
+
+  ToolchainInfo = {
+    Identifier = toolchainName;
+  };
+
+  # We could pull this out of developer_cmds but it adds an annoying
+  # loop if we want to bootstrap and this is just a tiny script so I'm
+  # not going to bother.
+  mkdep-darwin-src = fetchurl {
+    url        = "https://opensource.apple.com/source/developer_cmds/developer_cmds-63/mkdep/mkdep.sh";
+    sha256     = "0n4wpqfslfjs5zbys5yri8pfi2awyhlmknsf6laa5jzqbzq9x541";
+    executable = true;
+  };
+in
+
+runCommand "Toolchains" {} (''
+  toolchain=$out/XcodeDefault.xctoolchain
+  mkdir -p $toolchain
+
+  install -D ${writeText "ToolchainInfo.plist" (toPlist {} ToolchainInfo)} $toolchain/ToolchainInfo.plist
+
+  ln -s $toolchain $toolchain/usr
+
+  mkdir -p $toolchain/include
+  mkdir -p $toolchain/lib
+  mkdir -p $toolchain/libexec
+  mkdir -p $toolchain/share
+  mkdir -p $toolchain/bin
+
+  for bin in ${getBin stdenv.cc}/bin/*; do
+    ln -s $bin $toolchain/bin
+  done
+
+  for bin in ${getBin stdenv.cc.bintools.bintools}/bin/*; do
+    if ! [ -e "$toolchain/bin/$(basename $bin)" ]; then
+      ln -s $bin $toolchain/bin
+    fi
+  done
+
+  ln -s ${buildPackages.yacc}/bin/yacc $toolchain/bin/yacc
+  ln -s ${buildPackages.yacc}/bin/bison $toolchain/bin/bison
+  ln -s ${buildPackages.flex}/bin/flex $toolchain/bin/flex
+  ln -s ${buildPackages.flex}/bin/flex++ $toolchain/bin/flex++
+  ln -s $toolchain/bin/flex $toolchain/bin/lex
+
+  ln -s ${buildPackages.m4}/bin/m4 $toolchain/bin/m4
+  ln -s $toolchain/bin/m4 $toolchain/bin/gm4
+
+  ln -s ${buildPackages.unifdef}/bin/unifdef $toolchain/bin/unifdef
+  ln -s ${buildPackages.unifdef}/bin/unifdefall $toolchain/bin/unifdefall
+
+  ln -s ${buildPackages.gperf}/bin/gperf $toolchain/bin/gperf
+  ln -s ${buildPackages.indent}/bin/indent $toolchain/bin/indent
+  ln -s ${buildPackages.ctags}/bin/ctags $toolchain/bin/ctags
+'' + optionalString stdenv.isDarwin ''
+  for bin in ${getBin buildPackages.darwin.cctools}/bin/*; do
+    if ! [ -e "$toolchain/bin/$(basename $bin)" ]; then
+      ln -s $bin $toolchain/bin
+    fi
+  done
+
+  ln -s ${buildPackages.darwin.bootstrap_cmds}/bin/mig $toolchain/bin
+  mkdir -p $toolchain/libexec
+  ln -s ${buildPackages.darwin.bootstrap_cmds}/libexec/migcom $toolchain/libexec
+  ln -s ${mkdep-darwin-src} $toolchain/bin/mkdep
+'')
diff --git a/nixpkgs/pkgs/development/tools/xcbuild/wrapper.nix b/nixpkgs/pkgs/development/tools/xcbuild/wrapper.nix
new file mode 100644
index 000000000000..861ef0fc8473
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/xcbuild/wrapper.nix
@@ -0,0 +1,142 @@
+{ stdenv, makeWrapper, writeText, runCommand
+, CoreServices, ImageIO, CoreGraphics
+, runtimeShell, callPackage
+, xcodePlatform ? stdenv.targetPlatform.xcodePlatform or "MacOSX"
+, xcodeVer ? stdenv.targetPlatform.xcodeVer or "9.4.1"
+, sdkVer ? stdenv.targetPlatform.sdkVer or "10.12" }:
+
+let
+
+  toolchainName = "com.apple.dt.toolchain.XcodeDefault";
+  sdkName = "${xcodePlatform}${sdkVer}";
+
+  # TODO: expose MACOSX_DEPLOYMENT_TARGET in nix so we can use it here.
+  sdkBuildVersion = "17E189";
+  xcodeSelectVersion = "2349";
+
+  xcbuild = callPackage ./default.nix {
+    inherit CoreServices ImageIO CoreGraphics stdenv;
+  };
+
+  toolchains = callPackage ./toolchains.nix {
+    inherit toolchainName stdenv;
+  };
+
+  sdks = callPackage ./sdks.nix {
+    inherit toolchainName sdkName xcodePlatform;
+    version = sdkVer;
+  };
+
+  platforms = callPackage ./platforms.nix {
+    inherit sdks xcodePlatform;
+  };
+
+  xcconfig = writeText "nix.xcconfig" ''
+    SDKROOT=${sdkName}
+  '';
+
+  xcode-select = writeText "xcode-select" ''
+#!${runtimeShell}
+while [ $# -gt 0 ]; do
+   case "$1" in
+         -h | --help) ;; # noop
+         -s | --switch) shift;; # noop
+         -r | --reset) ;; # noop
+         -v | --version) echo xcode-select version ${xcodeSelectVersion} ;;
+         -p | -print-path | --print-path) echo @DEVELOPER_DIR@ ;;
+         --install) ;; # noop
+    esac
+    shift
+done
+  '';
+
+  xcrun = writeText "xcrun" ''
+#!${runtimeShell}
+while [ $# -gt 0 ]; do
+   case "$1" in
+         --sdk | -sdk) shift ;;
+         --find | -find)
+           shift
+           command -v $1 ;;
+         --log | -log) ;; # noop
+         --verbose | -verbose) ;; # noop
+         --no-cache | -no-cache) ;; # noop
+         --kill-cache | -kill-cache) ;; # noop
+         --show-sdk-path | -show-sdk-path)
+           echo ${sdks}/${sdkName}.sdk ;;
+         --show-sdk-platform-path | -show-sdk-platform-path)
+           echo ${platforms}/${xcodePlatform}.platform ;;
+         --show-sdk-version | -show-sdk-version)
+           echo ${sdkVer} ;;
+         --show-sdk-build-version | -show-sdk-build-version)
+           echo ${sdkBuildVersion} ;;
+         *) break ;;
+    esac
+    shift
+done
+if ! [[ -z "$@" ]]; then
+   exec "$@"
+fi
+  '';
+
+in
+
+runCommand "xcodebuild-${xcbuild.version}" {
+  nativeBuildInputs = [ makeWrapper ];
+  inherit (xcbuild) meta;
+
+  # ensure that the toolchain goes in PATH
+  propagatedBuildInputs = [ "${toolchains}/XcodeDefault.xctoolchain" ];
+
+  passthru = {
+    inherit xcbuild;
+    toolchain = "${toolchains}/XcodeDefault.xctoolchain";
+    sdk = "${sdks}/${sdkName}";
+    platform = "${platforms}/${xcodePlatform}.platform";
+  };
+
+  preferLocalBuild = true;
+} ''
+  mkdir -p $out/bin
+
+  ln -s $out $out/usr
+
+  mkdir -p $out/Library/Xcode
+  ln -s ${xcbuild}/Library/Xcode/Specifications $out/Library/Xcode/Specifications
+
+  ln -s ${platforms} $out/Platforms
+  ln -s ${toolchains} $out/Toolchains
+
+  mkdir -p $out/Applications/Xcode.app/Contents
+  ln -s $out $out/Applications/Xcode.app/Contents/Developer
+
+  # The native xcodebuild command supports an invocation like "xcodebuild -version -sdk" without specifying the specific SDK, so we simulate this by
+  # detecting this case and simulating the output; printing the header and appending the normal output via appending the sdk version to the positional
+  # arguments we pass through to the wrapped xcodebuild.
+  makeWrapper ${xcbuild}/bin/xcodebuild $out/bin/xcodebuild \
+    --add-flags "-xcconfig ${xcconfig}" \
+    --add-flags "DERIVED_DATA_DIR=." \
+    --set DEVELOPER_DIR "$out" \
+    --set SDKROOT ${sdkName} \
+    --run '[ "$#" -eq 2 ] && [ "$1" = "-version" ] && [ "$2" = "-sdk" ] && echo ${sdkName}.sdk - macOS ${sdkVer} \(macosx${sdkVer}\) && set -- "$@" "${sdkName}"' \
+    --run '[ "$1" = "-version" ] && [ "$#" -eq 1 ] && (echo Xcode ${xcodeVer}; echo Build version ${sdkBuildVersion}) && exit 0' \
+    --run '[ "$1" = "-license" ] && exit 0'
+
+  substitute ${xcode-select} $out/bin/xcode-select \
+    --subst-var-by DEVELOPER_DIR $out/Applications/Xcode.app/Contents/Developer
+  chmod +x $out/bin/xcode-select
+
+  substitute ${xcrun} $out/bin/xcrun
+  chmod +x $out/bin/xcrun
+
+  for bin in PlistBuddy actool builtin-copy builtin-copyPlist \
+             builtin-copyStrings builtin-copyTiff \
+             builtin-embeddedBinaryValidationUtility \
+             builtin-infoPlistUtility builtin-lsRegisterURL \
+             builtin-productPackagingUtility builtin-validationUtility \
+             lsbom plutil; do
+    ln -s ${xcbuild}/bin/$bin $out/bin/$bin
+  done
+
+  fixupPhase
+''