blob: d68b63da8bd8d6749486ed703a0f9770bbfe5d2e [file] [log] [blame]
#!/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