Skip to content

Commit

Permalink
Add build phase to detect nested frameworks (#21130)
Browse files Browse the repository at this point in the history
  • Loading branch information
mokagio authored Jul 20, 2023
2 parents 9192af0 + 723f8ed commit e39537b
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
27 changes: 27 additions & 0 deletions Scripts/BuildPhases/LintNestedFrameworks.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/bin/sh -eu

set pipefail

# Nested frameworks (i.e. having a Frameworks/ folder inside *.app/Frameworks/.framework) is invalid and will make the build be rejected during TestFlight validation.
#
# See also https://github.com/woocommerce/woocommerce-ios/pull/4226

# This script is intended to be used as a Build Phase on the main app target, as the very last build phase (and especially after the "Embed Frameworks" phase)

NESTED_FMKS_DIRS=$(find "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -name Frameworks -depth 2)
if [ -z "$NESTED_FMKS_DIRS" ]; then
echo "✅ No nested framework found, you're good to go!"
else
echo "❌ Found nested \`Frameworks\` folder inside frameworks of final bundle."
for fmk_dir in $NESTED_FMKS_DIRS; do
# Extract the name of the parent framework containing the nested ones
parent_fmk=$(basename $(dirname $fmk_dir) .framework)
# Extract the list of frameworks nested inside that parent framework. In the next command:
# * `-depth 1` is to avoid logging cases of "C nested in B itself nested in A" (2+ levels of nesting), since C nested in B will already be logged when looping on fmk_dir=B, so no need to log it during fmk_dir=A too.
# * The `sed` command removes the leading `./` in the paths returned by `find`, then quote the results in backticks for nicer formatting in final message.
# * The `tr` command joins all the lines (= found frameworks) with a `,`. Note that this will result in an extra comma at the end of the list too, but we'll get rid of that in the final message using ${nested_fmks%,} bash substitution.
nested_fmks=$(cd "${fmk_dir}" && find . -name '*.framework' -depth 1 | sed "s:^./\(.*\)$:\`\1\`:" | tr '\n' ',')
echo "error: Found nested frameworks in ${fmk_dir} -- Such a configuration is invalid and will be rejected by TestFlight. Please fix by choosing 'Do Not Embed' for the nested framework(s) ${nested_fmks%,} within the \`${parent_fmk}\` Xcode project which links to them. See paNNhX-ee-p2."
done
exit 1
fi
39 changes: 39 additions & 0 deletions WordPress/WordPress.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -18419,6 +18419,7 @@
37399571B0D91BBEAE911024 /* [CP] Embed Pods Frameworks */,
920B9A6DAD47189622A86A9C /* [CP] Copy Pods Resources */,
E1C5456F219F10E000896227 /* Copy Gutenberg JS */,
3FF795712A6671DB00F27B17 /* Lint against nested frameworks */,
);
buildRules = (
);
Expand Down Expand Up @@ -18715,6 +18716,7 @@
FABB264A2602FC2C00C8785C /* [CP] Embed Pods Frameworks */,
FABB264B2602FC2C00C8785C /* [CP] Copy Pods Resources */,
FABB264C2602FC2C00C8785C /* Copy Gutenberg JS */,
3FF795732A66730200F27B17 /* Lint against nested frameworks */,
);
buildRules = (
);
Expand Down Expand Up @@ -20230,6 +20232,43 @@
shellPath = /bin/sh;
shellScript = "$SRCROOT/../Scripts/BuildPhases/GenerateCredentials.sh\n";
};
3FF795712A6671DB00F27B17 /* Lint against nested frameworks */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Lint against nested frameworks";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"$SRCROOT/../Scripts/BuildPhases/LintNestedFrameworks.sh\"\n";
};
3FF795732A66730200F27B17 /* Lint against nested frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Lint against nested frameworks";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"$SRCROOT/../Scripts/BuildPhases/LintNestedFrameworks.sh\"\n";
};
49AE9271B82C7D67430387FA /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
Expand Down

0 comments on commit e39537b

Please sign in to comment.