Add rules_xcodeproj targets to each package BUILD plus a root m323 project, with extra_files filegroups so the full source tree shows in Xcode. Ignore Scala/Metals build dirs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
104 lines
3.8 KiB
Bash
Executable file
104 lines
3.8 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
# readonly forced_swift_compile_file="$1"
|
|
readonly exclude_list="$2"
|
|
|
|
# # Touching this file on an error allows indexing to work better
|
|
# trap 'echo "private let touch = \"$(date +%s)\"" > "$DERIVED_FILE_DIR/$forced_swift_compile_file"' ERR
|
|
|
|
readonly test_frameworks=(
|
|
"libXCTestBundleInject.dylib"
|
|
"libXCTestSwiftSupport.dylib"
|
|
"IDEBundleInjection.framework"
|
|
"XCTAutomationSupport.framework"
|
|
"Testing.framework"
|
|
"XCTest.framework"
|
|
"XCTestCore.framework"
|
|
"XCTestSupport.framework"
|
|
"XCUIAutomation.framework"
|
|
"XCUnit.framework"
|
|
)
|
|
|
|
readonly rsync="$BAZEL_INTEGRATION_DIR/rsync"
|
|
|
|
if [[ "$ACTION" != indexbuild ]]; then
|
|
# Copy product
|
|
if [[ -n ${BAZEL_OUTPUTS_PRODUCT:-} ]]; then
|
|
cd "${BAZEL_OUTPUTS_PRODUCT%/*}"
|
|
|
|
if [[ -f "$BAZEL_OUTPUTS_PRODUCT_BASENAME" ]]; then
|
|
# Product is a binary, so symlink instead of rsync, to allow for Bazel-set
|
|
# rpaths to work
|
|
ln -sfh "$PWD/$BAZEL_OUTPUTS_PRODUCT_BASENAME" "$TARGET_BUILD_DIR/$PRODUCT_NAME"
|
|
else
|
|
# Product is a bundle
|
|
"$rsync" \
|
|
--copy-links \
|
|
--recursive \
|
|
--times \
|
|
--delete \
|
|
${exclude_list:+--exclude-from="$exclude_list"} \
|
|
--perms \
|
|
--chmod=u+w \
|
|
--out-format="%n%L" \
|
|
"$BAZEL_OUTPUTS_PRODUCT_BASENAME" \
|
|
"$TARGET_BUILD_DIR"
|
|
|
|
if [[ -n "${TEST_HOST:-}" ]]; then
|
|
# We need to re-sign test frameworks that Xcode placed into the test
|
|
# host un-signed
|
|
readonly test_host_app="${TEST_HOST%/*}"
|
|
|
|
# Only engage signing workflow if the test host is signed
|
|
if [[ -f "$test_host_app/embedded.mobileprovision" ]]; then
|
|
codesigning_authority=$(codesign -dvv "$TEST_HOST" 2>&1 >/dev/null | /usr/bin/sed -n -E 's/^Authority=(.*)/\1/p'| head -n 1)
|
|
|
|
for framework in "${test_frameworks[@]}"; do
|
|
framework="$test_host_app/Frameworks/$framework"
|
|
if [[ -e "$framework" ]]; then
|
|
codesign -f \
|
|
--preserve-metadata=identifier,entitlements,flags \
|
|
--timestamp=none \
|
|
--generate-entitlement-der \
|
|
-s "$codesigning_authority" \
|
|
"$framework"
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# Incremental installation can fail if an embedded bundle is recompiled but
|
|
# the Info.plist is not updated. This causes the delta bundle that Xcode
|
|
# actually installs to not have a bundle ID for the embedded bundle. We
|
|
# avoid this potential issue by always including the Info.plist in the delta
|
|
# bundle by touching them.
|
|
# Source: https://github.com/bazelbuild/tulsi/commit/27354027fada7aa3ec3139fd686f85cc5039c564
|
|
# TODO: Pass the exact list of files to touch to this script
|
|
readonly plugins_dir="$TARGET_BUILD_DIR/${PLUGINS_FOLDER_PATH:-}"
|
|
if [[ -d "$plugins_dir" ]]; then
|
|
find "$plugins_dir" -depth 2 -name "Info.plist" -exec touch {} \;
|
|
fi
|
|
|
|
# Xcode Previews has a hard time finding frameworks (`@rpath`) when using
|
|
# framework schemes, so let's symlink them into
|
|
# `$TARGET_BUILD_DIR` (since we modify `@rpath` to always include
|
|
# `@loader_path/SwiftUIPreviewsFrameworks`)
|
|
if [[ "${ENABLE_PREVIEWS:-}" == "YES" && \
|
|
-n "${PREVIEW_FRAMEWORK_PATHS:-}" ]]; then
|
|
mkdir -p "$TARGET_BUILD_DIR/$WRAPPER_NAME/SwiftUIPreviewsFrameworks"
|
|
cd "$TARGET_BUILD_DIR/$WRAPPER_NAME/SwiftUIPreviewsFrameworks"
|
|
|
|
# shellcheck disable=SC2016
|
|
xargs -n1 sh -c 'ln -shfF "$1" $(basename "$1")' _ \
|
|
<<< "$PREVIEW_FRAMEWORK_PATHS"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# TODO: https://github.com/MobileNativeFoundation/rules_xcodeproj/issues/402
|
|
# Copy diagnostics, and on a change
|
|
# `echo "private let touch = \"$(date +%s)\"" > $DERIVED_FILE_DIR/$forced_swift_compile_file"`
|
|
# See git blame for this comment for an example
|