m323/Sources/Aufgabe6/Aufgabe6.xcodeproj/rules_xcodeproj/bazel/copy_outputs.sh
cediackermann b1968074b6
build: generate per-package and aggregate Xcode projects
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>
2026-06-29 14:00:40 +02:00

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