# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/ios/ios_sdk.gni")
import("//build/toolchain/apple/toolchain.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/rbe.gni")
import("//build/toolchain/toolchain.gni")
import("//build_overrides/build.gni")

# This is included by reference in the //build/config/compiler config that
# is applied to all targets. It is here to separate out the logic.
config("compiler") {
  # These flags are shared between the C compiler and linker.
  common_flags = []

  # CPU architecture.
  if (current_cpu == "x64") {
    triplet_cpu = "x86_64"
  } else if (current_cpu == "x86") {
    triplet_cpu = "i386"
  } else if (current_cpu == "arm" || current_cpu == "armv7") {
    triplet_cpu = "armv7"
  } else if (current_cpu == "arm64") {
    triplet_cpu = "arm64"
  } else {
    assert(false, "unsupported cpu: $current_cpu")
  }

  # Environment.
  if (target_environment == "simulator") {
    triplet_environment = "-simulator"
  } else if (target_environment == "device") {
    triplet_environment = ""
  } else if (target_environment == "catalyst") {
    triplet_environment = "-macabi"
  } else {
    assert(false, "unsupported environment: $target_environment")
  }

  # OS.
  triplet_os = "apple-ios"

  # Set target.
  common_flags = [
    "-target",
    "$triplet_cpu-$triplet_os$ios_deployment_target$triplet_environment",
  ]

  # This is here so that all files get recompiled after an Xcode update.
  # (defines are passed via the command line, and build system rebuild things
  # when their commandline changes). Nothing should ever read this define.
  defines = [ "CR_XCODE_VERSION=$xcode_version" ]

  asmflags = common_flags
  cflags = common_flags
  swiftflags = common_flags

  swiftflags += [
    "-swift-version",
    "5",
  ]

  cflags_objcc = [
    # Without this, the constructors and destructors of a C++ object inside
    # an Objective C struct won't be called, which is very bad.
    "-fobjc-call-cxx-cdtors",

    # When using -std=c++20 or higher, clang automatically returns true for
    # `__has_feature(modules)` as it enables cxx modules. This is problematic
    # because Objective-C code uses this to detect whether `@import` can be
    # used (this feature is also named modules).
    #
    # Since Chromium does not yet enable cxx modules, nor clang modules,
    # force disable the cxx modules, which cause `__has_features(modules)`
    # to return false unless clang modules are explicitly enabled.
    "-Xclang",
    "-fno-cxx-modules",
  ]

  ldflags = common_flags
}

# This is included by reference in the //build/config/compiler:runtime_library
# config that is applied to all targets. It is here to separate out the logic
# that is iOS-only. Please see that target for advice on what should go in
# :runtime_library vs. :compiler.
config("runtime_library") {
  # The variable ios_sdk_path is relative to root_build_dir when using Goma RBE
  # and system Xcode (since Goma RBE only supports paths relative to source).
  # Rebase the value in that case since gn does not convert paths in compiler
  # flags (since it is not aware they are paths).
  _sdk_root = ios_sdk_path
  if (use_system_xcode && (use_goma || use_remoteexec)) {
    _sdk_root = rebase_path(ios_sdk_path, root_build_dir)
  }

  common_flags = [
    "-isysroot",
    _sdk_root,
  ]
  swiftflags = [
    "-sdk",
    _sdk_root,
  ]

  if (target_environment == "catalyst") {
    common_flags += [
      "-isystem",
      "$_sdk_root/System/iOSSupport/usr/include",
      "-iframework",
      "$_sdk_root/System/iOSSupport/System/Library/Frameworks",
    ]

    swiftflags += [
      "-isystem",
      "$_sdk_root/System/iOSSupport/usr/include",
      "-Fsystem",
      "$_sdk_root/System/iOSSupport/System/Library/Frameworks",
    ]
  }

  asmflags = common_flags
  cflags = common_flags
  ldflags = common_flags
}

config("ios_executable_flags") {
  ldflags = []

  # On "catalyst", the bundle structure is different (uses the same structure
  # as a regular macOS app), so an additional -rpath is required.
  if (target_environment == "catalyst") {
    ldflags += [ "-Wl,-rpath,@loader_path/../Frameworks" ]
  }

  ldflags += [ "-Wl,-rpath,@executable_path/Frameworks" ]
}

config("ios_extension_executable_flags") {
  configs = default_executable_configs

  ldflags = [
    "-e",
    "_NSExtensionMain",
    "-fapplication-extension",
  ]

  # On "catalyst", the bundle structure is different (uses the same structure
  # as a regular macOS app), so an additional -rpath is required.
  if (target_environment == "catalyst") {
    ldflags += [ "-Wl,-rpath,@loader_path/../../../../Frameworks" ]
  }

  ldflags += [ "-Wl,-rpath,@executable_path/../../Frameworks" ]
}

config("ios_dynamic_flags") {
  ldflags = [
    # Always load Objective-C categories and class.
    "-Wl,-ObjC",
  ]

  # The path to the Swift compatibility libraries (required to run code built
  # with version N of the SDK on older version of the OS) is relative to the
  # toolchains directory and changes with the environment when using the
  # system toolchain. When using the hermetic swift toolchain instead, those
  # libraries are relative to $swift_toolchain_path.
  if (swift_toolchain_path == "") {
    _swift_compatibility_libs_prefix = ios_toolchains_path
  } else {
    _swift_compatibility_libs_prefix = swift_toolchain_path
  }

  if (target_environment == "simulator") {
    _swift_compatibility_libs_suffix = "iphonesimulator"
  } else if (target_environment == "device") {
    _swift_compatibility_libs_suffix = "iphoneos"
  } else if (target_environment == "catalyst") {
    # The Swift compatibility libraries have changed location starting with
    # Xcode 13.0, so check the version of Xcode when deciding which path to
    # use.
    if (xcode_version_int >= 1300) {
      _swift_compatibility_libs_suffix = "macosx"
    } else {
      _swift_compatibility_libs_suffix = "maccatalyst"
    }
  }

  lib_dirs = [
    "$ios_sdk_path/usr/lib/swift",
    "$_swift_compatibility_libs_prefix/usr/lib/swift/" +
        "$_swift_compatibility_libs_suffix",
  ]

  # When building for catalyst, some Swift support libraries are in a
  # different directory which needs to be added to the search path.
  if (target_environment == "catalyst") {
    lib_dirs += [ "$ios_sdk_path/System/iOSSupport/usr/lib/swift" ]
  }
}

config("ios_shared_library_flags") {
  ldflags = [
    "-Wl,-rpath,@executable_path/Frameworks",
    "-Wl,-rpath,@loader_path/Frameworks",
  ]
}

config("xctest_config") {
  # Add some directories to the system framework search path to make
  # them available to the compiler while silencing warnings in the
  # framework headers. This is required for XCTest.
  common_flags = [
    "-iframework",
    rebase_path("$ios_sdk_platform_path/Developer/Library/Frameworks",
                root_build_dir),
    "-iframework",
    rebase_path("$ios_sdk_path/Developer/Library/Frameworks", root_build_dir),
  ]
  cflags = common_flags
  ldflags = common_flags
  swiftflags = common_flags

  include_dirs = [ "$ios_sdk_platform_path/Developer/usr/lib" ]
  lib_dirs = [ "$ios_sdk_platform_path/Developer/usr/lib" ]
  frameworks = [
    "Foundation.framework",
    "XCTest.framework",
  ]
}

config("enable_swift_cxx_interop") {
  swiftflags = [ "-enable-experimental-cxx-interop" ]
}

group("xctest") {
  public_configs = [ ":xctest_config" ]
}

_xctrunner_path =
    "$ios_sdk_platform_path/Developer/Library/Xcode/Agents/XCTRunner.app"

# When building with Goma RBE, $ios_sdk_platform_path corresponds to a symlink
# below $root_build_dir that points to the real SDK to use. Because the files
# are below $root_build_dir, it is not possible to list them as a target input
# without gn complaining (as it can't find a target creating those files).
#
# The symlinks are created by //build/config/apple/sdk_info.py script invoked
# via exec_script() from //build/config/{ios/ios_sdk.gni,mac/mac_sdk.gni}.
# As the invocation is done by exec_script, there is no target that can list
# those files as output.
#
# To workaround this, add a target that pretends to create those files
# (but does nothing). See https://crbug.com/1061487 for why this is needed.
if (use_system_xcode && (use_goma || use_remoteexec)) {
  action("copy_xctrunner_app") {
    testonly = true
    script = "//build/noop.py"
    outputs = [
      "$_xctrunner_path/Info.plist",
      "$_xctrunner_path/PkgInfo",
      "$_xctrunner_path/XCTRunner",
    ]
  }
}

# When creating the test runner for an XCUITest, the arm64e slice of the binary
# must be removed (at least until the app ships with arm64e slice which is not
# yet supported by Apple).
action("xctest_runner_without_arm64e") {
  testonly = true
  script = "//build/config/ios/strip_arm64e.py"
  sources = [ "$_xctrunner_path/XCTRunner" ]
  outputs = [ "$target_out_dir/XCTRunner" ]
  args = [
    "--output",
    rebase_path(outputs[0], root_build_dir),
    "--input",
    rebase_path(sources[0], root_build_dir),
    "--xcode-version",
    xcode_version,
  ]

  # When running under ASan, the ASan runtime library must be packaged alongside
  # the test runner binary.
  deps = [ "//build/config/sanitizers:deps" ]
  if (use_system_xcode && (use_goma || use_remoteexec)) {
    deps += [ ":copy_xctrunner_app" ]
  }
}
