fix(macCatalyst): construct correct path for executable#2510
Conversation
|
Note: this was against CLI v14.1.0 - I'm currently making sure rn75 works |
Unfortunately no :(
Maybe to make this solution more future-proof we'll fallback to other value if initial one fails? 🤔 |
|
I guess it is hard in CI, since you need an Xcode development team to do a macCatalyst build - it was pretty annoying to set up in my build test rig, at least 😅 Would you like me to alter the patch to actually check existence of the path so it can try both and return the one that works ? |
Ah, right 😞
Yes, IMO that's the safest solution. |
714bd16 to
c7eb1e6
Compare
|
I added a unit test and handle both cases now, force-pushed, and while the idea is roughly the same code is now different so re-requesting review, thanks you all |
cipolleschi
left a comment
There was a problem hiding this comment.
left a nit, but lgtm
| } | ||
|
|
||
| // macOS gets the product name, not the executable folder path | ||
| if (platform === 'macos') { |
There was a problem hiding this comment.
shouldn't this be if-else if?
There was a problem hiding this comment.
it certainly could be, but...it seemed to me the three cases were all mutually exclusive so simple if overrides/clobbers were semantically identical ?
case 1 - we're the default platform == ios && isCatalyst == false: default case join targetBuildDir + executableFolderPath
case 2 - we're the rare platform == ios && isCatalyst == true: clobber with result of maybe adding -maccatalyst to targetBuildDir -- note that catalyst is an ios platform subset, it will not go in to the platform == macos conditional as true
case 3 - we're the platform == macos: clobber join of targetBuildDir + fullProductName
Each of the three cases is unambiguously identifiable and unique so I thought a simple set of ifs + clobbers worked?
There was a problem hiding this comment.
I just pushed a tiny change in response to this, for future developers so less explanation + thought is required I hope
1- I altered the isCatalyst conditional to explicitly contain a platform === 'ios' clause as that is the assumption, so now it is more clear that the catalyst block will not ever collide with the macos block
2- I updated the comments to reflect the same, and the idea that the default case and the two override blocks are exclusive of one another
There was a problem hiding this comment.
Yes, they were equivalent. But with
if <cond1> {
}
if <cond2> {
}
if <cond3> {
}
All three conditions are always evaluated. With
if <cond1> {
} else if <cond2> {
} else if <cond3> {
}
cond2 is evaluated if and only if cond1 is false. cond3 is evaluated if and only if both cond1 and cond2 are false.
So, the if-elseif approach is slightly more efficient, and makes it clear that the conditions are mutually exclusive.
There was a problem hiding this comment.
@cipolleschi lots of discussion and we are in agreement with each other :-) - the question is that with the mixed signal I am hearing of "if/elseif/elseif is slightly better" vs "but I have approved the if/if/if version" - do you want me to convert it and re-push or not?
I don't want to swirl endlessly on this - it's a relatively small fix after all, but I'll do what you like (because, it's an easy conversion from if/if/if/ to if/elseif/elsif too).
So just let me know but I won't change+repush unless you ask, so we don't have another approval cycle unless desired
Cheers man
There was a problem hiding this comment.
@cipolleschi I'm still carrying this patch around locally - macCatalyst won't work without it - and just saw the stale bot ping it. Just waiting for a final judgement call here:
I don't want to swirl endlessly on this - it's a relatively small fix after all, but I'll do what you like (because, it's an easy conversion from if/if/if/ to if/elseif/elsif too).
So just let me know but I won't change+repush unless you ask, so we don't have another approval cycle unless desired
(I run this daily on average) https://github.com/mikehardy/rnfbdemo/blob/7703b147a627d4ae5448863a957508743a6c9100/patches/%40react-native-community%2Bcli-platform-apple%2B15.0.1.patch#L33-L34
I'll also note as a separate thing - I was able to get macos and macCatalyst builds to work for local execution without an Xcode development team! This is a huge advance (for me anyway) and maybe would unblock CI for macCatalyst builds? Trick is to add CODE_SIGNING_IDENTITY = ""; to the pbxproj file for the build targets:
and
https://stackoverflow.com/a/59315354/9910298
The development team requirement used to be a big blocker for CI but this gets around it
- targetBuildDir var now has `-maccatalyst` in it before it gets to this method, so no need to add it again - gracefully handle if -maccatalyst exists or not as area regresses frequently - fail fast with error message if targetBuildDir does not exist at all - add unit test for the with and without -maccatalyst case plus verify ios did not regress
c7eb1e6 to
295a23f
Compare
|
There hasn't been any activity on this pull request in the past 3 months, so it has been marked as stale and it will be closed automatically if no further activity occurs in the next 7 days. |
|
Thanks @mikehardy! |
Summary:
it appears targetBuildDir var now has
-maccatalystin it before it gets to this method, so no need to add it againThis was tweaked in #2312 but appears to have regressed again - are macCatalyst builds checked in CI 🤔 ?
Without this change, the path is incorrect (note the duplicate
-maccatalystin path):Highlight:
Test Plan:
I build and test with macCatalyst all the time: https://github.com/mikehardy/rnfbdemo/blob/main/make-demo.sh
I added a unit test that exercises the method, sending it old (without -maccatalyst) and new (with -maccatalyst) inputs to verify it handles both, and verify I didn't regress the more common ios build code path
Checklist