Skip to content

Commit

Permalink
modify xcodewrapper to do a runtime version check (#19822)
Browse files Browse the repository at this point in the history
fixes #19770

Devs are often unaware of the supported Xcode version and often run into weird build issues with either higher or lower Xcode versions.
We currently only support Xcode 15.1
This change ensures we convey that change when devs execute `make run-ios`
This commit also attempts to ensure `xcodebuild` command is wrapped with `XcodeWrapper`.

- iOS
- macOS

status: ready
  • Loading branch information
siddarthkay authored May 8, 2024
1 parent 834bf61 commit 43951b9
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
5 changes: 2 additions & 3 deletions nix/overlay.nix
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,8 @@ in {
ruby = super.ruby_3_1;
yarn = super.yarn.override { nodejs = super.nodejs-18_x; };
openjdk = super.openjdk11_headless;
xcodeWrapper = super.xcodeenv.composeXcodeWrapper {
version = "15.0";
allowHigher = true;
xcodeWrapper = callPackage ./pkgs/xcodeenv/compose-xcodewrapper.nix { } {
versions = ["15.1"];
};
go = super.go_1_20;
clang = super.clang_15;
Expand Down
50 changes: 50 additions & 0 deletions nix/pkgs/xcodeenv/compose-xcodewrapper.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{ stdenv, lib, writeShellScriptBin }:
{ versions ? [ "15.1" ]
, 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-plus";
version = lib.concatStringsSep "," versions;
# Fails in sandbox. Use `--option sandbox relaxed` or `--option sandbox false`.
__noChroot = true;
buildCommand = ''
mkdir -p $out/bin
cd $out/bin
ln -s "${xcodebuildWrapper}/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 "${xcodebuildWrapper}/bin/xcodebuild"
ln -s "${xcodeBaseDir}/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator"
cd ..
ln -s "${xcodeBaseDir}/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"
'';
}

0 comments on commit 43951b9

Please sign in to comment.