Files
swift-mirror/utils/find-overlay-dependencies.sh
Saleem Abdulrasool 41d9c2cc59 stdlib: restructure for OS family layout of SDK overlay
The SDK directory is now confusing as the Windows target also has a SDK
overlay.  In order to make this more uniform, move the SDK directory to
Darwin which covers the fact that this covers the XNU family of OSes.
The Windows directory contains the SDK overlay for the Windows target.
2018-12-06 11:32:05 -08:00

109 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env zsh
#===--- find-overlay-dependencies.sh - ...by looking at imported headers ---===#
#
## This source file is part of the Swift.org open source project
##
## Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See https://swift.org/LICENSE.txt for license information
## See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#
#===------------------------------------------------------------------------===#
# This script uses zsh for its associative array support, because it is only
# intended to be run on macOS and macOS bash is very old.
function usage() {
echo 'usage:' $0 '<module-name> [update|print]' >&2
exit 1
}
# `update` edits the cmake file in-place; `print` just prints to console
UPDATE_CMAKE=0
case $# in
1) ;;
2) if [[ $2 == 'update' ]]; then
UPDATE_CMAKE=1
elif [[ $2 != 'print' ]]; then
usage
fi ;;
*)
usage ;;
esac
OVERLAYS_PATH=$(dirname "$0")/../stdlib/public/Darwin/
CMAKE_PATH=$OVERLAYS_PATH/$1/CMakeLists.txt
# Add both directions to associative array
typeset -A CUSTOM_NAMED_MODULES
CUSTOM_NAMED_MODULES[ObjectiveC]=objc
CUSTOM_NAMED_MODULES[objc]=ObjectiveC
CUSTOM_NAMED_MODULES[Dispatch]=dispatch
CUSTOM_NAMED_MODULES[dispatch]=Dispatch
CUSTOM_NAMED_MODULES[XPC]=xpc
CUSTOM_NAMED_MODULES[xpc]=XPC
# Exclude XCTest/ and CMakeLists.txt
ALL_OVERLAYS=()
for overlay in $(find "$OVERLAYS_PATH" -depth 1 -type d ! -name XCTest -exec basename \{\} \;); do
ALL_OVERLAYS+=${CUSTOM_NAMED_MODULES[$overlay]-$overlay}
done
typeset -A SDKS
SDKS[macosx]="x86_64"
SDKS[iphoneos]="arm64"
SDKS[appletvos]="arm64"
SDKS[watchos]="armv7k"
SDKS_ORDERED=(macosx iphoneos appletvos watchos)
typeset -A CMAKE_DEPENDS_NAME
CMAKE_DEPENDS_NAME[macosx]="SWIFT_MODULE_DEPENDS_OSX"
CMAKE_DEPENDS_NAME[iphoneos]="SWIFT_MODULE_DEPENDS_IOS"
CMAKE_DEPENDS_NAME[appletvos]="SWIFT_MODULE_DEPENDS_TVOS"
CMAKE_DEPENDS_NAME[watchos]="SWIFT_MODULE_DEPENDS_WATCHOS"
echo $1
for sdk in $SDKS_ORDERED; do
sdkfull="${sdk}${SUFFIX}"
arch=$SDKS[$sdk]
printf "%s:\n\t" "$sdkfull"
deps=$(echo "@import $1;" | xcrun -sdk "${sdkfull}" clang -arch $arch -x objective-c -F $(xcrun -show-sdk-path -sdk "${sdkfull}")/System/Library/PrivateFrameworks - -M -fmodules 2>/dev/null)
if [[ $? != 0 ]]; then
# Clear the cmake file of this unsupported platform and loop
echo "unsupported"
# Disable the unsupported platform and leave a note
sed -i "" -E -e "s/^([ \t]*)($CMAKE_DEPENDS_NAME[$sdk]).*$/\1# \2 # unsupported platform/" "$CMAKE_PATH"
continue
fi
# Everything depends on Darwin implicitly
DEPENDS_ON=("Darwin")
for overlay in $ALL_OVERLAYS; do
(echo "$deps" |
egrep -v 'module.(module)?map' |
egrep -v '\bos/object.h\b|\bos/availability.h\b|\bos/base.h\b|\bos/lock.h\b' |
egrep -v "\b${CUSTOM_NAMED_MODULES[$1]-$1}\b" |
egrep -q "\b$overlay\b") &&
DEPENDS_ON+=${CUSTOM_NAMED_MODULES[$overlay]-$overlay}
done
if [[ $sdk != macosx* ]]; then
DEPENDS_ON=("${(@)DEPENDS_ON:#XPC}")
fi
# Foundation depends on CoreGraphics in the .swift code.
# Hardcode the dependency.
if [[ "$1" == "Foundation" ]]; then
DEPENDS_ON+="CoreGraphics"
fi
echo "$DEPENDS_ON"
if [[ $UPDATE_CMAKE == 1 ]]; then
sed -i "" -E -e "s/^([ \t]*$CMAKE_DEPENDS_NAME[$sdk]).*$/\1 $DEPENDS_ON # auto-updated/" "$CMAKE_PATH"
fi
done
echo # newline