// Copyright (C) 2009-2020 Apple Inc. All rights reserved.
// Copyright (C) 2009 Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// *** DO NOT ADD ANYTHING TO THIS FILE ***

// This file is an obsolete mechanism for setting ENABLE flags for WebKit
// features on the Cocoa platforms. Instead of adding to this file:
//
// 1) If the feature is on by default across most platforms, add code to
//    turn it on in PlatformEnable.h.
// 2) If the feature is not on by default, but on for Cocoa platforms,
//    add code to turn it on in PlatformEnableCocoa.h.
// 3) If the feature is on by default, but needs to be off for Cocoa
//    platforms, add code to turn it off in PlatformEnableCocoa.h.
// 4) If the feature is sometimes on for Cocoa platforms, put the code
//    to make that decision in PlatformEnableCocoa.h.

// *** DO NOT ADD ANYTHING TO THIS FILE ***

// This ENABLE_WEB_RTC configuration variable determines whether to *link* the libwebrtc library.
// The ENABLE_WEB_RTC macro in PlatformEnableCocoa.h determines whether WebKit's WebRTC code is compiled.
ENABLE_WEB_RTC = $(ENABLE_WEB_RTC_$(WK_PLATFORM_NAME));
ENABLE_WEB_RTC_iphoneos = ENABLE_WEB_RTC;
ENABLE_WEB_RTC_iphonesimulator = ENABLE_WEB_RTC;
ENABLE_WEB_RTC_macosx = ENABLE_WEB_RTC;
