# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# When building in Chromium, these configs is used to set #defines that indicate
# whether code is being built standalone, or in Chromium, or potentially in some
# other configutation.

import("crashpad_buildconfig.gni")

config("crashpad_is_in_chromium") {
  if (crashpad_is_in_chromium) {
    defines = [ "CRASHPAD_IS_IN_CHROMIUM" ]
  }
}

config("crashpad_is_in_fuchsia") {
  if (crashpad_is_in_fuchsia) {
    defines = [ "CRASHPAD_IS_IN_FUCHSIA" ]
  }
}

config("flock_always_supported_defines") {
  defines =
      [ "CRASHPAD_FLOCK_ALWAYS_SUPPORTED=$crashpad_flock_always_supported" ]
}

group("default_exe_manifest_win") {
  if (crashpad_is_in_chromium) {
    deps = [ "//build/win:default_exe_manifest" ]
  }
}

config("crashpad_fuzzer_flags") {
  cflags = [
    "-fsanitize=address",
    "-fsanitize-address-use-after-scope",
    "-fsanitize=fuzzer",
  ]

  ldflags = [ "-fsanitize=address" ]
}

if (crashpad_is_apple) {
  group("apple_enable_arc") {
    # If `crashpad_is_in_chromium`, then because Chromium enables ARC
    # compilation by default, no special configuration is needed.

    if (crashpad_is_standalone) {
      public_configs = [ "//third_party/mini_chromium/mini_chromium/build/config:apple_enable_arc" ]
    }
  }
}

if (crashpad_is_ios) {
  group("ios_xctest") {
    if (crashpad_is_in_chromium) {
      public_configs = [ "//build/config/ios:xctest_config" ]
    } else if (crashpad_is_standalone) {
      public_configs = [
        "//third_party/mini_chromium/mini_chromium/build/ios:xctest_config",
      ]
    }
  }

  if (crashpad_is_in_chromium) {
    import("//build/config/ios/ios_sdk.gni")
    crashpad_is_ios_app_extension = ios_is_app_extension
  } else {
    crashpad_is_ios_app_extension = false
  }

  config("crashpad_is_ios_app_extension") {
    if (crashpad_is_ios_app_extension) {
      defines = [ "CRASHPAD_IS_IOS_APP_EXTENSION" ]
    }
  }
}
