{ stdenv, lib }:
{ version ? "11.1"
, allowHigher ? false
, xcodeBaseDir ? "/Applications/Xcode.app" }:

assert stdenv.isDarwin;

stdenv.mkDerivation {
  pname = "xcode-wrapper${lib.optionalString allowHigher "-plus"}";
  inherit version;
  # Fails in sandbox. Use `--option sandbox relaxed` or `--option sandbox false`.
  __noChroot = true;
  buildCommand = ''
    mkdir -p $out/bin
    cd $out/bin
    ln -s /usr/bin/xcode-select
    ln -s /usr/bin/security
    ln -s /usr/bin/codesign
    ln -s /usr/bin/xcrun
    ln -s /usr/bin/plutil
    ln -s /usr/bin/clang
    ln -s /usr/bin/lipo
    ln -s /usr/bin/file
    ln -s /usr/bin/rev
    ln -s "${xcodeBaseDir}/Contents/Developer/usr/bin/xcodebuild"
    ln -s "${xcodeBaseDir}/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator"

    cd ..
    ln -s "${xcodeBaseDir}/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"

    # Check if we have the xcodebuild version that we want
    currVer=$($out/bin/xcodebuild -version | head -n1)
    ${if allowHigher then ''
    if [ -z "$(printf '%s\n' "${version}" "$currVer" | sort -V | head -n1)""" != "${version}" ]
    '' else ''
    if [ -z "$(echo $currVer | grep -x 'Xcode ${version}')" ]
    ''}
    then
        echo "We require xcodebuild version${if allowHigher then " or higher" else ""}: ${version}"
        echo "Instead what was found: $currVer"
        exit 1
    fi
  '';
}