How to access my app’s derived data folder itself?
Asked Answered
R

3

16

I’m in the middle of moving my iOS app’s Firebase dependency from CocoaPods to Swift Package Manager.

Firebase’s Crashlytics requires a script to be executed while the app is building (using the Run Script build phase). Back in the CocoaPods days, I used to call the script the way documented by Google: "${PODS_ROOT}/FirebaseCrashlytics/run".

After I’ve switched to SPM, Firebase files are no longer in ${PODS_ROOT}, and there’s no such variable available at all. I know the file I need is now located in the DerivedData folder, specifically it’s at ~/Library/Developer/Xcode/DerivedData/MyApp-abcde/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run. The problem is, the MyApp-abcde folder is not easily referenced.

A Medium post I found suggested using the ${BUILD_DIR} build variable (in regard to the example above, it would resolve to <…>/MyApp-abcde/Build/Products), and calling the dirname command to move up the directory hierarchy.

This hack worked only for running the app. When I tried to archive it, ${BUILD_DIR} resolved to another path, namely <…>/MyApp-abcde/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/BuildProductsPath. I tried a few more build variables, such as ${SYMROOT}, in place of ${BUILD_DIR}, but they also produce different paths depending on the operation.

So, here comes the question…

Is there a way to reliably reference my app’s derived data folder’s root (i.e. ~/Library/Developer/Xcode/DerivedData/MyApp-abcde) using Xcode’s build variables?

Ribose answered 29/10, 2020 at 19:52 Comment(0)
P
16

You were close. This should work:

${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
Proctoscope answered 22/12, 2020 at 14:43 Comment(2)
The path you have seems to work for both Run and Archive actions. Thank you so much!Ribose
For Xcode Server Bots (Xcode 12.4 era) use: ${XCS_DERIVED_DATA_DIR%/*}/Dependencies/checkoutsHusbandry
M
2

Crashlytics run script

To build&run from Xcode:

${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run

To archive for distribution from Xcode Server at CI/CD:

${XCS_DERIVED_DATA_DIR%/*}/Dependencies/checkouts/firebase-ios-sdk/Crashlytics/run

To work for both at the same time:

if [[ "${XCS_DERIVED_DATA_DIR}" == "" ]]; then
  ${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
else
  ${XCS_DERIVED_DATA_DIR%/*}/Dependencies/checkouts/firebase-ios-sdk/Crashlytics/run
fi
Marginal answered 25/10, 2021 at 19:37 Comment(0)
F
0

I'm reworking my answer as I realized I haven't answered your question..

I have a run script that copies the build targets into a new folder. This works for both Build and Archive. Note that you need the -L on copy to follow the symlink

# Copy the built framework into a sibling to the project folder
if [[ "$CONFIGURATION" == "Debug" ]]; then
  mkdir -p "$PROJECT_DIR/../../iwins-ios-sdk/debug"
  rm -rf "$PROJECT_DIR/../../iwins-ios-sdk/debug/IWiNS_SDK.framework"
  cp -LR "$BUILD_DIR/Debug-iphoneos/IWiNS_SDK.framework" "$PROJECT_DIR/../../iwins-ios-sdk/debug"
else
  mkdir -p "$PROJECT_DIR/../../iwins-ios-sdk/release"
  rm -rf "$PROJECT_DIR/../../iwins-ios-sdk/release/IWiNS_SDK.framework"
  cp -LR "$BUILD_DIR/Release-iphoneos/IWiNS_SDK.framework" "$PROJECT_DIR/../../iwins-ios-sdk/release"
fi

Also, you can find all of the build envvars here: https://gist.github.com/gdavis/6670468

So, it appears that $BUILD_DIR is different for build/release, but by copying the files to a known location at build time, you'll know where to find them.

Flocculus answered 9/11, 2020 at 22:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.