diff --git a/pkgs/development/mobile/xcodeenv/compose-xcodewrapper.nix b/pkgs/development/mobile/xcodeenv/compose-xcodewrapper.nix index f1ac578f26ef..5a888fb13b29 100644 --- a/pkgs/development/mobile/xcodeenv/compose-xcodewrapper.nix +++ b/pkgs/development/mobile/xcodeenv/compose-xcodewrapper.nix @@ -1,19 +1,41 @@ -{ 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 ''; }