#!/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/SDK/
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
