Unverified Commit c3009249 authored by toonn's avatar toonn Committed by GitHub
Browse files

xcodeenv: accept version & perform runtime checks (#324248)

parents 2f3eb1b6 15d5ce36
Loading
Loading
Loading
Loading
+29 −21
Original line number Diff line number Diff line
{ stdenv, lib }:
{ version ? "11.1"
, allowHigher ? false
, xcodeBaseDir ? "/Applications/Xcode.app" }:
{ lib,
  stdenv,
  writeShellScriptBin }:
{ versions ? [ ] , xcodeBaseDir ? "/Applications/Xcode.app" }:

assert stdenv.isDarwin;
let
  xcodebuildPath = "${xcodeBaseDir}/Contents/Developer/usr/bin/xcodebuild";

  xcodebuildWrapper = writeShellScriptBin "xcodebuild" ''
    currentVer="$(${xcodebuildPath} -version | awk 'NR==1{print $2}')"
    wrapperVers=(${lib.concatStringsSep " " versions})

    for ver in "''${wrapperVers[@]}"; do
      if [[ "$currentVer" == "$ver" ]]; then
        # here exec replaces the shell without creating a new process
        # https://www.gnu.org/software/bash/manual/bash.html#index-exec
        exec "${xcodebuildPath}" "$@"
      fi
    done

    echo "The installed Xcode version ($currentVer) does not match any of the allowed versions: ${lib.concatStringsSep ", " versions}"
    echo "Please update your local Xcode installation to match one of the allowed versions"
    exit 1
  '';
in
stdenv.mkDerivation {
  pname = "xcode-wrapper${lib.optionalString allowHigher "-plus"}";
  inherit version;
  name = "xcode-wrapper-impure";
  # 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
    ${if versions == [ ] then ''
    ln -s "${xcodebuildPath}"
    '' else ''
    ln -s "${xcodebuildWrapper}/bin/xcode-select"
    ''}
    ln -s /usr/bin/security
    ln -s /usr/bin/codesign
    ln -s /usr/bin/xcrun
@@ -22,23 +44,9 @@ stdenv.mkDerivation {
    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
  '';
}